[KAKAO 공채] 극악 난이도 실화? 카카오 코딩 테스트 후기 (2020.9)


9월 12일 토요일 오후 2시부터 5시간 30분 동안 (원래는 5시간인데, 도중에 테스트 지연 문제로 30분 연장되었다) 카카오 블라인드 채용 1차 코딩 테스트가 있었다. 난이도는 소문대로 극악무도했다. 연습 삼아 가벼운 마음으로 친 첫 코딩 테스트였지만 푸는 내내 스트레스가 매우 심했다. 문제는 기존처럼 총 7 문제였으며, 꼭 난이도가 순차적으로 증가한다고 볼 수는 없었다. (2번 문제 푸는데 2시간 30분을 써버렸으니...)  


카카오 1차 코딩 테스트 응시 완료 화면




프로그래머스 플랫폼을 이용해 코딩 테스트가 진행되었다. 사진은 2020년 상반기 기출 1번 문제다. 카카오 코딩 테스트를 위해 기출 문제를 보려면 프로그래머스에 잘 정리되어 있다.



카카오 코딩 테스트 정보와 함께 프로그래머스 이용 방법을 포스팅 한 것이 있어 참고하면 좋을 것이다.

 


우선 문제 자체를 캡쳐하여 공유하는 것은 문제가 될 수 있기 때문에 (사실 시간압박이 심해서 그럴 시간도 없다) 문제를 제대로 복원해 공유할 수는 없다. 7 문제 중 확실히 정답 처리되고 테스트 완료된 것은 2.5~3개밖에 안되고, 시도한 문제 수도 4개여서 사실 그게 가능했어도 다 다룰 수도 없다. 그래도 복사해 둔 내 코드와 기억에 의존해 간략하게 나마 어떤 문제들이 출제되었는지 살펴보고자 한다.


1번 문제는 생성하고자 하는 아이디를 입력 받았을 때, 여러 가지 조건들을 각각 만족시키지 못할 때 각각 어떻게 수정해야하는, 주어진 조건을 알맞게 '구현'하는 것에 중점을 둔 문제로 기억된다. 예를 들어 '..Philgineer...com#-kakao...' 라는 입력이 있다면, 이를 다양한 조건들을 만족시키도록 순차적으로 변형시켜서 결과적으로 'Philgineer.com-kakao' 라는 출력을 내게 만드는 것이다.

첫 문제여서 느긋하게 풀었는데, 카카오 문제들이 죄다 글 자체가 굉장히 길고 복잡한 구성을 가지고 있어서 난이도가 높지 않아 보이는 문제들마저 빠르게 풀기는 힘들다. 1번 문제의 경우, 함정들이 숨어 있기 때문에 맞는 것 같은데 자꾸 테스트에서 실패하는 경우가 발생했다. 현직 개발자인 친구도 까다로운 한 부분 때문에 점수를 받지 못했다고 한다.




바로 이 부분이다.  주어진 조건 중 하나인데, '..' 이나 '...' 처럼 '.' 이 연달아 나오면 '.' 하나로 출력해야 하는 조건에 관한 것이다. (별개의 조건으로, 입력의 시작이나 끝 부분이 '.'이면 없애는 것도 공존한다.)

처음에는 당연히 for 문으로 될 줄 알고 열심히 코딩을 했지만, 계속 다양한 오류를 생성해서 결국 list에서 pop이 for 문을 돌며 진행될 때 형태가 어떻게 변하는지 직접 prompt에서 테스트를 해보고 나서야 깨달았다. pop이 실행되면, list의 길이와 인덱스 위치가 바뀌기 때문에 for 문에서 돌고 있는 i의 값이 순서대로 가지 못하게 되는 것이다. 그래서 해결책으로, 위와 같이 while을 통해 pop 하는 경우에는 i가 그대로 i로 다시 반복하고, pop 하지 않는 경우에만 i가 i + 1 로 나아가게끔 만들었다.



2번 문제는 카카오 코딩 테스트가 극악 난이도라는 것을 뼈저리게 느끼게 했지만, 결국 3시간에 가까운 시간 만에 (취준생임을 망각하고 한 문제에 집착했으니 자랑은 아니다)  풀어내고 "통과" 판정을 받음으로써 그래도 나란 인간이 코딩에 소질이 아예 없는 것은 아니라는 일말의 희망을 안겨주었다. 인간 승리!

문제를 간략히 소개하자면, 식당에서 함께 많이 팔리는 메뉴를 n개 묶어서 '세트 메뉴'를 만드는 문제였다. 보기에는 간단해 보일지 몰라도, 새로 만들 세트 메뉴를 구성하는 메뉴 수가 입력에 따라 유동적으로 변하고, 모든 손님에게 나간 메뉴들의 데이터도 'AB' (손님1은 A와 B를 먹음), 'ACD' (손님2는 A와 C와 B를 먹음) 와 같이 그 수가 유동적으로 변하기 때문에 굉장히 까다로웠다.
나는 우선 입력 중 모든 메뉴들을 set으로 묶어내어 그 원소들로 '가능한 조합'을 모두 생성해내고 (n이 몇이냐에 따라 따로 해줘야한다), 그걸 팔린 메뉴 히스토리를 for 문으로 돌면서 몇 번 등장했는지 체크하는 식으로 접근했다. 간략히 한 부분을 첨부하겠다.



사진에서도 볼 수 있듯이, 곳곳에 포진된 주석처리된 print() 들만 봐도 얼마나 한 단계 단계 데이터 출력을 경험적으로 체킹하면서 고생했는지 알 수 있을 것이다. 정말 로직들을 촘촘히 연결해가는 과정이 복잡하면서도 어려웠고, 해결했을 때 기쁨이 컸던 가장 애정이 가는 문제다.





3번 문제는 엑셀 데이터처럼 속성과 값이 순서대로 주어지는 'info' 데이터와, 그 데이터 중 어떤 조건을 검색하고자 하는 'query' 데이터 두 가지 입력이 주어지고, 엑셀이나 SQL 등 데이터 분석 툴에서처럼 실제로 그 조건을 만족하는 데이터의 개수를 출력하는 함수를 완성하는 문제다.

정답 처리는 받았지만, 시간 효율성도 부분 점수로  따로 체크하는 문제였는데 그 부분은 감점을 받았다. 코드를 살펴보면 물론 그 가혹한 채점에 뭐 불만은 없다. (for 문이 대체 몇 겹인거냐;;)



4번은 시간 상 건너 뛰었고,
5번 문제는 풀긴 했지만 시간 초과 판정을 받아 점수를 받지 못했다.  동영상 길이와 광고 길이가 주어지고, 또 사용자들의 시청 구간 데이터가 주어질 때, 가장 동시 시청이 많은 구간을 광고 길이에 맞게 index를 구해서 '최적 광고 삽입 구간'을 구하는 문제다.


시간이 모자라는 시점이어서 입력 데이터를 급히 다루기 쉽게 초 단위로 변경하는 함수를 만들고, 직관적인 접근법을 취했다. 바로 가장 무식하면서도 가장 직관적인, "광고 시간만큼의 필터를 생성하고, 모든 동영상 시간을 for 문으로 1초씩 돌면서 최적의 시간을 찾아내는" 굳이 명명하자면 CNN에서 영감을 받은 convolutional optimization 이랄까. (ㅋㅋㅋ)
컴퓨터공학 과목들보다는 머신러닝, 딥러닝에 치중해 공부해왔더니 확실히 이런 (복잡도 효율성 최악의) 발상이 더 익숙했던 것 같다. GPU로 10시간 학습시켜 가중치 행렬 하나 만들어내는 딥러닝이 판치는 세상에서, 최댓값 테스트 데이터에 대한 출력이 고작 10초를 초과했다고 '시간 초과'를 판정하다니 너무 가혹하다는 생각을 해본다.

6번, 7번 문제는 손도 못 댔기 때문에 생략한다. 높은 난이도의 문제들을 5시간이 넘는 시간 동안 끙끙대며 풀어보느라 힘들었지만, 그래도 의미 있는 시도였다고 생각한다.



댓글 쓰기

3 댓글