도약을 위한 작은 실패

컴퓨터를 잡은지 4년차에 처음으로 공채라는 것을 지원해봤습니다.

결론부터 말하면 탈락했습니다. 합격했다면 더 당당한 후기가 될뻔했는데 아쉽습니다.

그럼 전체적인 후기를 남겨보겠습니다.

1차 : 온라인 코딩테스트

총평 : 6번 문제 풀고, 그냥 all solve로 마칠 걸이라는 생각이 듭니다.

1차는 모두가 알고 있는 알고리즘 코딩테스트입니다. 총 7문제가 나왔고, 문제 풀이도 공식적으로 다 올라왔습니다.

저는 대회 시작 30분 후부터, 대회 종료 1시간 전에 마쳤으니 총 3시간 30분 정도를 코딩테스트 시간에 투자했습니다.

문제 자체는 어려웠습니다. 제가 지금까지 들어왔던 코딩테스트 문제 중에서는 가장 어려운 축에 속했던 것 같습니다. 문제 별로 간략한 평가를 하자면 다음과 같습니다. 저는 총 6문제 풀었습니다.

문제 링크는 다음과 같습니다.

문제 사용언어 평가
문자열 압축 Python 문자열에서 특정 반복 구간을 처리하는 문제입니다. n 제한이 작은 걸보고 python으로 구현했습니다.
괄호 변환 C++ 조건대로 재귀함수를 짜면 됩니다. 국어 문제에 가까운 문제입니다. 확인 함수와 처리 두 가지 함수를
자물쇠와 열쇠 C++ 이 문제는 보자마자 전수조사임을 알고, 바로 구현에 도입했습니다. key를 4방향으로 돌리는 방법과 배열을 좀 키 크기*2만큼 더 잡아서 풀면 쉽게 구현할 수 있습니다.
가사 검색 C++ Trie 문제입니다. 정규표현식이나 파싱도 좀만 노력하면 풀 수 있을 것 같습니다. 정방향 Trie와 역방향 Trie를 만들어 풀면 됩니다. 제 생각에는 알고리즘으로는 가장 어려운 문제 중 하나인데, 코테에서는 종종 나오는 듯 합니다.
기둥과 보 설치 Python 가장 좋았던 문제 중 하나입니다. 구현 of 구현 문제로 조건을 다 찾아서 구현하면 됩니다. 기둥 배열, 보 배열을 따로 관리하고, 각각 연결 되어있는 포인트 들의 케이스를 모두 살피면 됩니다.
외벽 점검   뭔가 바로 풀이가 안보이고, 헬스를 가야해서 안풀었습니다. 그리 어렵지는 않았는데, 풀고 올솔브할걸이라는 미련만 남습니다.
블록 이동하기 C++ 가로와 세로 상태를 저장하는 N * N * 2 배열을 만들고 BFS/DFS를 돌리면 됩니다. 응용 중에서 전형적인 문제입니다. 회전 가능 케이스, 회전 시 상태 등만 고려하면 됩니다.

여러 코딩테스트 문제를 풀어보거나, 들어봤는데 가장 어려운 코딩테스트 중 하나였던 것 같습니다. 컷은 3문제 선에서 갈렸고 아마 점수 차이나 시간 차이가 아닌가 싶습니다.

2차 : 오프라인 코딩테스트

총평 : 환경에 대한 세팅 및 공부는 좀 더 구체적으로 하고 갑시다.

2차는 판교 어떤 건물에서 진행이 됬습니다. 2차 테스트 참가자는 300명 정도였습니다. 노트북은 개인 노트북 또는 지원 노트북을 사용할 수 있는데, 저는 시간 맞춰 갈 예정이라 제 노트북을 사용했습니다. 제 맥북보다 조오금 더 좋은 스펙의 맥북을 제공하는 것 같았는데 좀 아쉽습니다.

2차 코딩테스트는 총 3 과정으로 진행되었습니다.

2-1. 본인의 관심사

뇌 그림을 주고, 본인의 관심사를 쓰는 과정이었습니다. 성적에는 반영이 되지 않는다고 합니다. 저는 요즘 AI를 공부하면서 XAI와 Visualization, 그리고 개발 툴(IDE) 등에 관심이 많아서 그런 내용을 적었습니다.

2-2. 온라인 필기시험

뭔가 전형적인 CS 문제 였습니다. 컴과 기본 지식 문제라 그리 어렵지는 않았습니다. 총 13문제가 나왔고, 분야는 자료구조, 알고리즘, OS, DB 문제가 나왔습니다. (저는 아직 TOPCIT, 정보처리기사, 컴활 등을 보지 않았는데 아마 그런 류의 문제인거 같습니다.)

객관식과 단답형 문제가 나왔고 개인적으로 문제가 어렵지는 않았습니다. (전공생 입장에서)

화장실을 가고 싶어서 5분 일찍 제출했는데, 시스템 오류가 있는건지 아니면 원래 보여주는건지 제 성적을 봤습니다. 저는 65점 만점에 60점을 받았습니다. 아마 DB 정규화에서 틀렸을 것 같은데 공부해야겠습니다.

2-3. 온라인 코딩테스트

아마 핵심은 이 테스트가 아닐까 싶습니다. 알고리즘 문제가 아닌 코딩테스트 문제는 처음이라 기대하고 갔습니다.

코딩테스트 문제는 전화번호부와 팔로우를 주면, 그 정보를 바탕으로 추천시스템을 만드는 문제였습니다. 구체적인 문제는 다 명세하기도 힘들고 후에 공개할테니 따로 언급하지는 않겠습니다. 문제는 small, large 문제가 주어졌고 점수 배점은 약 20점, 60점이었던걸로 기억합니다.

API 사용법을 몰라 전날 밤에 기출 문제와 간단한 사용법을 2시간 보고 갔는데, 막상 테스트 시작하고 안되서 애먹었습니다. 그래도 테스트 도중 검색을 허용하여 다행이었습니다. 제 코딩테스트 과정을 정리하면 다음과 같습니다.

  1. 사용언어는 python, editor는 vscode를 사용했습니다.

  2. 문제지가 제 기억으로 18 페이지였는데, 시작 1시간동안은 API 명세를 이해하지 못해 문제였습니다. 그래서 우선 조건대로 코드를 짜보자가 제 전략이었습니다.

  3. API로 정보를 보내는 걸 몰라서 애먹었습니다. header를 포함시키는 방법, data를 json으로 바꿔야한다는 것 등등을 검색을 통해 알았습니다.

  4. 저는 그리디하게 사용자별 가능성을 2차원 배열에 저장하고, 정렬해서 확률이 가장 높은 사람만 추천하는 방식으로 진행했습니다. 하지만 여기서 명세 이해 부족이 문제가 되었는데, 전화번호부에 있다고 이 서비스를 이용하지 않을 수 있다는 점을 몰랐습니다. 그래서 또 시간을 날렸습니다. 사실 그 외에도 구현이 dict를 너무 많이 써서 어지러웠습니다.

  5. 대회 3시간 정도에 중도 퇴실을 할 수 있었는데 0점 퇴실은 할 수 없다는 생각에 다시 집중을 하고, 명세에 대한 이해가 아닌 추측을 통해 코드를 모두 수정했습니다. 결국 네 시쯤에 1번 문제의 점수가 나왔고, 약 18점 중후반이 나왔습니다. 명세서 읽고 쓰는 연습을 좀 해야겠다는 생각을 했습니다.

  6. 그 다음은 2번 문제를 풀었는데, 2번 문제에서 사용하는 API의 명세가 이해가 안되서 고민하다가 1번 로직을 그대로 돌렸고, 약 1.6점 정도 나왔습니다.

  7. API의 예제와 다르게 결과를 받았는데 아마 API 명세에 대한 이해 부족이 낮은 점수를 만든게 아닌가 싶습니다.

  8. freeze 되고 약 150등 정도였고, 아마 끝까지 엄청 큰 변화는 없었을 것 같습니다.

아마 합 점수는 20점이 살짝 안나왔고 떨어질거라 생각했습니다. API 사용법을 깨달았다는데 보람을 느끼고 집에 돌아왔습니다. 그리고 지인이 꽤나 많아서 신기했습니다. (아는 사람은 8명~10명?) 제 지인 중에 최종합격자가 있다면 좋겠네요.

3차 : 기업별 개별 과제

총평 : 이 분야로 나아가고 싶다면 좀 더 딥러닝 개발에 힘쓰자.

의도하지 않게 2차 코딩테스트가 합격하고, 그 후에는 지원한 부서에서 개별적으로 연락을 해주었습니다. 저는 카카오브레인을 지원했고, 카카오브레인의 연락을 따로 받았습니다.

카카오브레인의 경우, 약 일주일 기간동안 과제를 주었습니다.

바로 2019년 8월에 발표된 논문인 RAdam을 읽고, 논문 간략 요약 및 코드 개선 과제였습니다. 조금 더 자세하게 리뷰하면 다음과 같습니다.

3-1. RAdam : 논문 간략 요약

논문 요약을 위해 가졌던 어려움은 다음과 같았습니다.

  • RAdam은 Adam 및 다른 optimization 방법론을 보다 의미있게 분석하고 개선한 알고리즘 입니다.
    • 즉, 설명하고 요약하기 위해서는 기존 optimization method에 대한 이해가 있어야합니다.
    • RMSprop, Adam을 알고 있었기는 하나 로직을 몰랐습니다. 즉 처음부터 다 공부해야하는거죠.
  • 논문에 대한 설명 자료가 부족했습니다.
    • 나온지 2개월이 채 안된 논문이기에 논문 외의 자료가 부족했습니다. 국내 글은 거의 0에 가까웠고, 해외 medium 등의 글도 많이는 없어서 논문 외의 참고할만한 자료가 매우 적었습니다.
    • 그래서 repo의 issue, kaggle 검색 등 다양한 검색을 했는데 크게 도움되지는 않았습니다.

개인적으로는 이러한 조건을 고려한 과제였다고 생각합니다. 덕분엔 Optimizatin Method를 전체적으로 공부하고, 개념적인 이해가 많이 되서 공부가 많이 되긴했습니다.

3-2. RAdam : Pytorch 논문 코드 개선

여기서도 정말 많은 이슈가 있었는데 다음과 같습니다.

  • Pytorch 미숙
    • 저는 딥러닝을 Keras로 입문했고, 현재는 딥러닝보다는 캐글과 머신러닝에 초점을 두고 코드를 작성하고 있습니다.
    • Pytorch는 코드를 이해하고, 세부 부분을 작성할 수는 있지만 optimizer 딴에서 코드를 짜본적은 없습니다.
  • 코드 개선이란 무엇일까?
    • 처음에는 코드 개선은 최적화를 의미한다고 생각했습니다. 하지만 코드에서 딱히 logic에서 개선할 점을 찾지를 못했습니다. 그렇기에 어떤 개선을 할 수 있는지가 가장 의문이었습니다.
    • 변수명을 개선할까 하였으나 기존 pytorch의 다른 optimizer이 같은 변수명을 사용해서 변경하기가 애매했습니다. (지금도 momentum을 exp_avg, adaptive learning rate를 exp_avg_sq로 사용하는게 마음에 안드네요.)
    • 결론적으로 docstring과 error메세지, 변수명 주석을 추가했습니다.
    • 코드 개선은 아직도 어떻게 해야하는지 잘 모르겠네요.
  • PlainRAdam과 RAdam, 2가지 클래스
    • 코드는 총 2 클래스 개선이 있습니다.
    • 단순 논문 구현 코드와 논문에서 개선한 코드입니다.
    • PlainRAdam은 논문 로직에서 생략한 부분을 풀어서 적었으나 개선 코드는 수정할 부분이 매우 적었습니다.
    • RAdam에서 사용하는 buffer라는 변수를 아직 이해하지 못했습니다. :(

제 의도에 맞게 개선되었다고 믿고 싶으나 잘은 모르겠습니다. 모범 답안이 있다면 후에 공부하고 싶고, 이런 개선 관련으로 pull request 경험을 좀 쌓아야겠습니다.

단기간에 많은 공부를 한 과제였고, 논문을 앞으로 더 읽고 싶다는 생각이 듭니다. (과제를 하며 정리한 RAdam은 후에 블로그에 올리도록 하겠습니다.)

전반적으로 제 부족함을 많이 느낀 과제였습니다.

마무리

첫 공채를 지원했고, 결과는 탈락이었습니다. 많은 공부를 했고, 좋은 경험이었습니다. 매 과제, 테스트마다 부족함을 느꼈고, 조금씩 성장할 수 있었습니다.

하지만 합격했다면 더 좋았겠고, 합격이 아니더라도 면접을 보고 싶었는데 아쉬움은 조금 남습니다.

또 열심히하면 좋은 결과가 올 것이라 믿습니다. 앞으로도 수 많은 기회가 올 것이라 믿고, 지금보다 더 열심히 나아가야겠습니다.

저는 앞으로 어떤 가치를 만드는 사람이 될까요. 멋진 사람이 되면 좋겠네요. :)


마무리 + @

해당 코딩테스트가 끝나고 1~2주 후에 카카오브레인에서 카카오엔터프라이즈 로 추천을 해주었습니다. (추천을 받으면 자소서 + 최종면접 만 보게 됩니다. )

자소서 작성 후에는 미필이니 정규직이 아닌 인턴으로 다시 제안이 왔고, 면접 후에 인턴으로 근무하게 되었습니다.

결론은 음성처리파트의 음성합성셀에서 인턴을 하게 되었다는 간단한 추가 설명!


오랫동안 꿈을 그리는 사람은 마침내 그 꿈을 닮아간다

Leave a Comment