3 minute read

개요

  • 오늘은 이번달 말에 있는 제로베이스 교육과정중 코딩테스트 연습 차원에서, 제로베이스 측에서 내준 Programmers 기반의 문제를 풀어보는 시간이 있었다.

  • 180분, 10문항.

코딩테스트 연습

1. [제로베이스 프론트엔드 스쿨_Billboard]

채점 결과

  • 정답 (1.0/1.0)

리뷰

  • 크기 n의 큐에 데이터를 넣어주는 느낌으로 풀었다.

  • 이번 문제에서는 함정이 두가지 있었다.

    1. 전광판에 전체 문자가 한번 들어갔다 나온 뒤에는 전광판 크기만큼 공백이 들어간다.
      • 입력 예시의 10초와 15초 구간을 통해 유추해야 했다.
    2. 전광판에 들어가는 빈 문자(' ')역시 (.)으로 치환해서 넣어야 한다.
      • 글자 중간의 띄어쓰기나 아예 빈문자만 출력하는 등의 입력 예제가 함정으로 숨어있었는지, 첫 제출때는 오답처리가 났었다.

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)

리뷰

  • 원래 풀던 풀이에 급하게 생각난 예외사항을 덧붙이느라 코드가 다소 난잡해진 문제였다.

  • 이 문제에서 함정은 크게 두가지가 있었다.

    1. 확진자 역시 여러번 건물을 드나들수 있다.
    2. 처음부터 끝까지 건물에 박혀있는 사람이 있을수도 있다.
  • 처음 이 문제를 보고 접근한 방식은 다음과 같았다.
      확진자가 들어간 인덱스만 체크해서, 그 구간에 기록이 남은 사람을 잡자!
    
  • 그래서 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)

리뷰

  • 개인적으로, 분명 접근은 잘 했다 생각했는데 순전히 코드를 못짜서 망해버린 문제라고 생각한다.

  • 처음 접근은 다음과 같이 진행했다. ```
    1. 모든 구간을 선회하며 각 구간에서 나올수 있는 최대의 넓이를 찾는다.
    2. 각 구간에서 나오는 넓이중 최대값을 고른다.
    3. Profit! ```
  • 각 구간에서 나올수 있는 최대의 넓이란, 구간 첫 판자의 길이 * 구간 첫 판자보다 짧은게 나오기 전까지의 판자 개수로 생각했고, 첫 테스트 케이스 역시 이런 접근법으로 금방 끝낼수 있었다.

  • 하지만 테스트 케이스 [5, 10, 10, 10, 5, 50, 50, 50]과 같은 배열에서 오류가 나기 시작해 결국 오류를 못잡고 시간 초과로 오답처리되었다.

2022.03.16 추가

  • 코딩테스트 문제에 대해 블로그에 게재하는것을 허용하지 않는다는 학원측의 답변이 올라온 관계로, 문제와 입력/출력 사항, 제한사항, 풀이를 모두 삭제했다.