제로베이스 20220315
개요
-
오늘은 이번달 말에 있는 제로베이스 교육과정중 코딩테스트 연습 차원에서, 제로베이스 측에서 내준 Programmers 기반의 문제를 풀어보는 시간이 있었다.
-
180분, 10문항.
코딩테스트 연습
1. [제로베이스 프론트엔드 스쿨_Billboard]
채점 결과
- 정답 (1.0/1.0)
리뷰
-
크기 n의 큐에 데이터를 넣어주는 느낌으로 풀었다.
-
이번 문제에서는 함정이 두가지 있었다.
- 전광판에 전체 문자가 한번 들어갔다 나온 뒤에는 전광판 크기만큼 공백이 들어간다.
- 입력 예시의 10초와 15초 구간을 통해 유추해야 했다.
- 전광판에 들어가는 빈 문자
(' ')
역시(.)
으로 치환해서 넣어야 한다.- 글자 중간의 띄어쓰기나 아예 빈문자만 출력하는 등의 입력 예제가 함정으로 숨어있었는지, 첫 제출때는 오답처리가 났었다.
- 전광판에 전체 문자가 한번 들어갔다 나온 뒤에는 전광판 크기만큼 공백이 들어간다.
2. [제로베이스 프론트엔드 스쿨_BuildPyramid]
채점 결과
- 정답 (1.0/1.0)
리뷰
-
1~n까지의 합을 구하는 문제였다.
-
n(n+1)/2 를 프로그램상으로 구현하여 마무리했다.
3. [제로베이스 프론트엔드 스쿨_BusStop]
채점 결과
- 오답(제출 없음) (-/1.0)
리뷰
-
이차원 좌표상의 최단거리를 구하는 문제이다.
-
처음에는 이중 반복문으로 정류장의 위치를 구하고, 각 좌표에서 정류장의 좌표를 뺀 값 중에서 최소가 되는 값을 찾아보는 방식으로 접근했다.
-
시간 복잡도 때문에 삼중 반복문은 아닐것이라며 계속 다른 방법을 고민하느라 결국 제출조차 하지 못했다.
4. [제로베이스 프론트엔드 스쿨_CalcElectricityFee]
채점 결과
- 정답 (1.0/1.0)
리뷰
- 배열의 합에 요금을 곱하면 끝나는 문제다.
5. [제로베이스 프론트엔드 스쿨_Calculator]
채점 결과
- 정답 (1.0/1.0)
리뷰
- eval() 함수를 모른다면 코드의 길이가 길어졌을 문제다.
6. [제로베이스 프론트엔드 스쿨_AppDesign]
채점 결과
- 정답 (1.0/1.0)
리뷰
-
결국 약수 중에서 가운데에 있는 두 값을 반환하라는 문제다.
-
예시에서도
[2,2]
로 보여주었듯, 약수가 홀수인 경우와 짝수인 경우 두가지 경우를 세워 풀어주었다.
7. [제로베이스 프론트엔드 스쿨_BinaryDistance]
채점 결과
- 정답 (1.0/1.0)
리뷰
- 숫자를 이진수로 표현하는 함수는 bin()이다.
- 다만, 이 함수를 쓰면 이진수라는 의미로 앞에
0x
가 붙어서 나오므로, 문자열로 변환한 뒤 앞의 두글자를 제거했다.
- 다만, 이 함수를 쓰면 이진수라는 의미로 앞에
- 1이 나오면 길이 측정을 시작하여 다음 1이 나오면 측정을 중단하는 방식으로 인접한 두 1사이의 거리를 arr배열에 보관했다.
- 다만, 위의 코드에서 잘못된 점이 있는데 다시 1이 나오더라도 flag를 False로 만들면 안되는 것이었다.
- 이 문제에 관해서는 뒤에서 한번 더 언급하겠다.
- arr배열 내부의 최대값을 찾아주는 max()함수로 가장 긴 1의 거리를 반환.
8. [제로베이스 프론트엔드 스쿨_Corona]
채점 결과
- 정답 (1.0/1.0)
리뷰
-
원래 풀던 풀이에 급하게 생각난 예외사항을 덧붙이느라 코드가 다소 난잡해진 문제였다.
-
이 문제에서 함정은 크게 두가지가 있었다.
- 확진자 역시 여러번 건물을 드나들수 있다.
- 처음부터 끝까지 건물에 박혀있는 사람이 있을수도 있다.
- 처음 이 문제를 보고 접근한 방식은 다음과 같았다.
확진자가 들어간 인덱스만 체크해서, 그 구간에 기록이 남은 사람을 잡자!
- 그래서 inf_in과 inf_out을 통해 확진자의 출입 시간에 대한 인덱스를 확보했다.
- 원래는 변수로 설정하려 했지만,
확진자 역시 여러번 건물을 드나들수 있다
라는것이 떠올라 배열을 통해 확진자의 모든 출입 시간을 확보했다.
- 원래는 변수로 설정하려 했지만,
-
history[inf_in[k]+1:inf_out[k]]
를 통해 확진자의 출입 시간대에 사람이 드나든 기록을 조사하여 제출했지만, 오답이 발생했다. -
곰곰히 생각해보니,
확진자가 들어오기 전부터 건물 안에 있고, 확진자가 나간 후에 나간 인원
이 있다면 위의 방법이 통하지 않을것이란 생각이 들었다.- 테스트 케이스를 만들어 돌려보니 예상대로 걸러내지 못했다.
- 각 시간대별 건물 내부에 있는 인원을 저장하는 배열인 in_man_per_time 배열을 생성하였고, 처음에 만들어준 답안에 더해주니 드디어 정답이 나왔다.
9. [제로베이스 프론트엔드 스쿨_CoronaKeepDistance]
채점 결과
- 정답 (1.0/1.0)
리뷰
-
위의 7번 문제와 상당히 유사한 문제이고, 유사하게 풀렸다.
-
7번 문제와의 차이점은 이번 문제는
방역 수칙을 한번이라도 어기면 즉시 답이 나온다는것
이다. -
7번 문제에서 언급했던것중 탐색이 끝났을때 flag를 False로 바꾸면 안됬었다고 한 이유가 이 문제에서 나왔는데, 다음과 같은 상황이 있었기 때문이다.
10001001, 방역 레벨 2단계 10001 -> 거리 세칸. 방역수칙 이행. flag = False로 변경. 1001 -> 거리 두칸. 방역수칙 불이행. 하지만 man == 0 and flag == False이므로 탐색하지 않음. 오류 발생.
-
위의 상황처럼 한번 검사가 끝난 직후 바로 0이 연달아 나올때 flag가 꺼져있으면 문제가 발생할수 있다는 것이다.
- 다만, 7번 문제의 경우 문제가 이진수였기에 그렇게 극단적인 경우의 수를 테스트케이스에 못넣은것 같았다.
- 10010001을 10진수로 변환한 145가 7번 문제의 케이스에 있었다면 실수를 알아채는게 조금은 더 빨랐을지도 모르겠다.
10. [제로베이스 프론트엔드 스쿨_BrokenBridge]
채점 결과
- 오답 (0.2/1.0)
리뷰
-
개인적으로, 분명 접근은 잘 했다 생각했는데 순전히 코드를 못짜서 망해버린 문제라고 생각한다.
- 처음 접근은 다음과 같이 진행했다.
```
- 모든 구간을 선회하며 각 구간에서 나올수 있는 최대의 넓이를 찾는다.
- 각 구간에서 나오는 넓이중 최대값을 고른다.
- Profit! ```
-
각 구간에서 나올수 있는 최대의 넓이란,
구간 첫 판자의 길이 * 구간 첫 판자보다 짧은게 나오기 전까지의 판자 개수
로 생각했고, 첫 테스트 케이스 역시 이런 접근법으로 금방 끝낼수 있었다. - 하지만 테스트 케이스
[5, 10, 10, 10, 5, 50, 50, 50]
과 같은 배열에서 오류가 나기 시작해 결국 오류를 못잡고 시간 초과로 오답처리되었다.
2022.03.16 추가
- 코딩테스트 문제에 대해 블로그에 게재하는것을 허용하지 않는다는 학원측의 답변이 올라온 관계로, 문제와 입력/출력 사항, 제한사항, 풀이를 모두 삭제했다.