기업용 코딩테스트 준비하기 - 공부법

CmplxN·2020년 11월 7일
34

다뤄야할 주제

모든 사람들이 동의할 수 있을 만큼 유형을 잘 나누지는 못하겠다.
그래도 기본적으로 알고 가야할 큼직한 주제(기본)과 모르면 가끔 아쉬울 주제(심화)로 대충 나눠 써본다.
실제 심화라기 보다는 위에서부터 아래로 가는 순서로 공부하면 된다고 가볍게 생각하면 되겠다.
적어도 내가 멋대로 심화라고 적어놓은 주제가지 커버하면 입사 코딩테스트에서 어려움은 겪지 않을 것이다.

구현 및 시뮬레이션

구현 및 시뮬레이션은 그냥 문제에서 시키는대로 코딩하는(...) 유형이다.
사실 이거는 기본으로 특별히 유형이라고 분류하긴 애매하다.
하지만 많은 문제들이 특정 알고리즘과 무관한 단순 구현문제를 낸다.
심지어는 구현이 너무 복잡해서 반복문과 조건문만 알면 되는 문제가 시험의 최고난도 문제가 되기도 한다.

참고로 문자열 관련 구현문제는 정말 자주 나오는데, 여기서 정규표현식을 알아두면 유용하다. 시간이 난다면 정규표현식을 익히는 것을 추천한다. 링크1 링크2

완전 탐색(브루트 포스)

모든 경우를 탐색하는 유형이다.
효율적인 방법을 고민할 수도 있지만, 사실 많은 문제들은 무식하게 모든 경우를 탐색하면 풀리곤 한다.

특히 삼성 계열사를 최우선으로 노리고 있다면 이 유형을 마스터해야한다. (다른 시험에도 무조건 나온다)
삼성 입사 시험은 의심할 필요도 없이 완전 탐색이라고해도 틀리지 않기 때문이다.
흔히들 들어본 dfs, bfs, 백트래킹, 기초적인 그래프 탐색 모두 완전탐색 그 자체거나 양념을 친(?) 것이라고 생각하면 되겠다.

그외 기본

  1. DP : DP가 자주 나오지는 않지만, DP가 무엇인지알고 쌩 기초 수준은 풀 수 있는게 좋다.
  2. 이분탐색 : lowerBound, upperBound까지 알아두면 좋다.
  3. 그리디 : 완전탐색이 아니라 그리디하게 목표점을 찾아갈 수도 있다.
  4. 자료구조 활용 : 스택, 큐, 데크, 맵, 셋 등을 활용하는 기본문제도 나온다.
  5. 정렬 : 유형이라고 하긴 민망하지만, 정렬만 잘해도 그냥 풀리는 문제도 있다.

심화?

  1. 투 포인터 : 최근 카카오에서 계속 나오는 유형이다. 어려운 개념은 아니다.
  2. 트리 : 트리 자료구조를 만들어서 푸는 문제다. 트라이도 기출로 나온적이 있다.
  3. 세그먼트 트리 : 알면 쉽게 풀 수 있는 경우가 가끔 있다. BOJ 랭작을 할 수 있다.
  4. 그래프 : 최단거리 문제(다익, 플로이드, 벨만포드)나 mst 문제도 충분히 나올만 하고, 나오고 있다.
  5. 수학 : 기하학까진 아니더라도 간단한 정수론 문제는 나올 수 있을 것다.
  6. DP : 좀더 어려운 수준의 DP도 나오곤 한다.

어떻게 공부해야하는가

플랫폼

아무래도 나는 신입 레벨이었으므로, BOJ, Programmers 중심으로 했다.

BOJ

웬만한 문제는 BOJ의 문제 번호로 검색하면 풀이를 검색할 수 있을 정도로 대한민국에서 가장 유명한 PS(Problem Solving) 온라인 저지다.
다양한 유형의 문제가 다수 제공되기 때문에 특정 유형을 집중적으로 공부하기 좋은 사이트다.
그리고 후술할 SWEA에도 없는 삼성 SW역량테스트의 기출문제(정확히 말하면 복원)가 있다.
solved.ac에서 제공하는 랭크 시스템(?)으로 문제 난이도를 가늠할 수 있고, 자신의 실력을 늘리는 재미를 느낄 수 있다.
입사 레벨을 넘은 대회용 문제들도 있어 관심있다면 도전할 수 있다.

Programmers

삼성을 제외한 다수의 기업이 이용하는 코딩테스트 플랫폼이다. 그러므로 시험환경 적응차 사용해보는 것이 좋다.
이곳에서 카카오 공채와 인턴 기출문제를 확인할 수 있다. (이게 가장 큰 매력)
이곳은 BOJ와 달리 표준 입출력을 사용하지 않으므로 어떤 면에서는 편하다.
문제 자체는 BOJ만큼 많지는 않지만 SQL도 연습해 볼 수 있고, 유용하다.
여기 말고도 Goorm을 이용해 코딩테스트를 보기도 하니 이곳도 적응 차 한번 참고해보자.

SWEA

이곳은 삼성전자에서 운영하는 사이트다. 만약 삼성 계열사들을 노린다면 이곳의 문제를 풀어보는 것을 추천한다.
특히 [모의 SW 역량테스트]는 실제 삼성 시험과 같은 유형, 난이도 그리고 환경이라고 볼 수 있을 정도로 좋다.
또한 삼성전자 A(2솔시 코딩테스트 면제), B(코딩테스트 면제 및 이따금 면접 우대), C형(제발 삼성 와주세요) 시험을 접수할 수 있는 사이트다.

해외 사이트

LeetCode, Codility, HackerRank 등이 있다.
신입 레벨에는 거의 없지만, 이들 사이트를 이용해 입사 시험을 보기도 한다.
경력 레벨에서 코딩테스트를 준비한다면 난이도도 이쪽 플랫폼을 이용하는 것을 추천한다.

몸만들기

본격적으로 취준을 시작하기 전부터 코딩테스트를 잘하는 사람은 드물다.
물론 알고리즘 수업을 들을 때 어찌저찌 알게 되었다거나 하는 경우도 있을 것이다.
하지만 비전공인 경우도 있고, 대부분은 코딩테스트가 생소할 것이다.
그런 상태에서 우연히 입사용 코딩테스트를 본다면 "이걸 어떻게 풀지?"하는 문화충격을 받을 수 있다.
그러므로 어느정도 시간을 가지고 코딩테스트를 볼 수 있는 "몸 만들기" 과정이 필요하다.

우선 기본적이고 당연한 것이지만, 주력 언어에 대한 최소한의 문법 이해가 필요하다.
여기서 최소한이라고 하면, 반복문, 조건문, 정렬, 자료구조 사용 수준이다.
정렬은 커스텀하게 만든 클래스(또는 구조체)에 대한 정렬정도는 할 수 있어야 한다.
자료구조는 스택, 큐, 우선순위 큐, 맵, 셋, 데크는 기본적으로 다룰 줄 알아야한다.

위에서 말한 최소한의 지식을 갖추었다면 내가 언급한 다뤄야할 주제를 다루면 된다.
나는 특정 유형 또는 주제를 잡고 그것을 마스터하고 다음 유형으로 넘어가는 방식으로 학습했다.
BOJ에는 다양한 유형의 문제가 양치기를 할 수 있을 정도로 많이 있다.
그래서 주로 BOJ에서 주제당 최대 이틀을 잡고 연습했으며 Programmers의 문제도 참고했다.
이런 방법으로 한달 정도(2020년 3월, 4월) 코딩테스트에 많이 투자하며 몸을 만들었다.

코딩테스트 같은 것에 시간을 많이 투자하는게 쉽지 않을 수는 있다.
하지만 한달에서 두달정도 빡세게 투자하면 그 효과는 톡톡할 것이라고 자신한다.
대학생이나 전업 취준생이라면 코딩테스트에 시간 투자하는 것을 추천한다.

유지하기

몸 만들기 과정을 통해 코딩테스트를 수월하게 통과할 수 있는 레벨이 될 수 있었다.
하지만 코딩 테스트라는 것이 다른 모든 시험들과 마찬가지로 안하다 보면 실력이 줄기 마련이다.
한번에 코딩테스트를 통과하고 면접까지 일사천리로 성공하면 다행이다.
하지만 그렇지 못한 경우가 훨씬 많으므로 어렵게 만든 "코딩테스트 몸"을 유지해야한다.

나는 코딩테스트 실력을 유지하기 위해 매일 최소 한문제를 풀었다.
당시에는 주제까지 정하고 한문제 이상 풀기를 하지는 않았지만, 여러 유형 골고루 풀면 된다.
이걸 어떻게 습관화하면 좋지만, 그게 말처럼 쉽지는 않다.
그런 경우 매일 1문제 이상 인증하기 온라인 스터디를 구성하는 것도 괜찮은 방법이다.
친구들과 하거나 챌린저스와 같은 앱에서 돈을 걸고 하면 된다.

마무리

이런식으로 코딩테스트를 준비했더니 웬만한 코딩테스트는 다 합격했던 것 같다.
인턴을 시작하고는 매일 1개 풀기를 중단했지만, 전환 직전에 있던 카카오, 라인 코딩테스트도 모두 통과했다.
(두달만에 코딩테스트를 봤던 카카오는 5솔, 라인은 6솔(전부 제출)했다.)

주력언어인 Kotlin을 쓸 수 있다면, 최소 1년간은 손을 놓아도 입사용 코딩테스트에서 불합격할 일은 없지 않을까 생각한다.
이 글을 읽는 분들도 내 경험을 참고해서 코딩 테스트 단계는 쉽게 통과하길 기원한다.

profile
Android Developer

1개의 댓글

comment-user-thumbnail
2021년 2월 22일

이직 준비 중인데 많은 도움이 됐습니다.
감사합니다!

답글 달기