본문 바로가기
나의 생각/기타

개발자 취업을 위한 코딩 테스트 준비 방법

by 카펀 2022. 4. 3.

* 코딩 테스트 준비를 위한 책을 리뷰했습니다! 한번 읽어보세요! (2023.05.21)

 

안녕하세요.

저는 현재 1년차 개발자로 일하고 있는 카펀이라고 합니다.

컴퓨터공학과를 졸업하였고, 취업 준비를 하면서, 그리고 현재도 꾸준히 코딩 테스트 합격을 위한 알고리즘/문제풀이 학습을 진행하고 있습니다.

현재까지 네이버, 라인, 넥슨, NHN, 프로그래머스 데브매칭 등 다양한 코딩테스트를 합격한 바 있으며, 현재도 개발자 공채 코딩 테스트에 꾸준히 지원하고 있습니다.

저도 불과 2년 전에 첫 코딩테스트를 봤을 때는 (2020 카카오 인턴십), 3시간 동안 1번 문제만 간신히 (그리고 매우 비효율적으로) 풀고 탈락했습니다. 작년 상반기까지는 코딩 테스트는 SW 마에스트로 1차 코딩 테스트 외에는 통과해 본 적이 없었고, 현재도 카카오 신입 공채 코딩테스트는 통과해 본 적이 없습니다 (ㅠㅠ).

그럼에도 제가 이러한 글을 작성하는 취지는, 개발자 취업을 목표로 하는 많은 분들께 제 경험이 조금이라도 도움이 될 수 있을까 하는 마음에 저의 경험과 학습 방향을 공유하려고 합니다.

저의 방법이 100% 옳다는 것은 아니며, 지극히 저라는 한 명의 개인의 경험을 담은 글이라는 점을 이해해 주시기 바랍니다.

궁금한 점이 있으시다면 댓글로 남겨 주세요. 글을 개선하는데 큰 도움이 될 것입니다.

 

자랑은 아니지만... 제 글의 신뢰도를 높이기 위해 네카라 코딩 테스트 합격 통지 스샷을 첨부합니다 ㅎㅎ;

목차

0. 코딩 테스트의 목적

1. 필요한 배경지식

2. 문제풀이

3. 코딩 테스트 환경

4. 제가 경험한 내용에 기반한 추천

 

0. 코딩 테스트의 목적

코딩 테스트란 무엇일까요? 이제 막 개발자 취업에 관심을 가지게 되신 분들이라면 코딩 테스트라는 것에 대해 처음 들어보게 됩니다.

컴퓨터공학 전공자 출신 분들이라면 익숙하실 수 있지만, 그렇지 않다면 처음에는 매우 생소하게 다가올 것입니다.

코딩 테스트는 제한 시간 내에 주어진 문제를 코드를 작성하여 푸는 시험입니다.

문제에서 제시한 규격에 맞는 입력이 주어졌을 때, 문제에서 기대하는 규격의 답을 출력하는 코드를 작성하게 됩니다.

코드는 프로그래밍 언어를 이용하여 작성하며, 사용할 수 있는 언어는 출제하는 기업에서 제시합니다. 주로 사용되는 언어로는 C++, Java, Python이 있고, 그 외에 C, JavaScript 등을 허용합니다.

이 코딩 테스트는 보통 테스트를 주최하는 기업에서 출제하며, 정답 여부를 매우 뚜렷하게 평가할 수 있습니다.

(단, 지원자가 정답 여부를 바로 알 수 있는 경우는 드뭅니다.)

 

몇 년 전부터 코딩 테스트는 점차 보편화되기 시작했고, 현재는 거의 모든 개발자 채용 과정에서 (신입/경력 상관없이) 코딩 테스트를 맨 처음 과정으로 제시합니다.

한 가지 예시를 보여 드리겠습니다. 현재 진행 중인 2022년 상반기 LINE 신입 개발자 채용 과정입니다.

보편적인 과정은 접수 -> 코딩 테스트 -> 1차 면접 -> 2차 면접 -> 합격 입니다.

기업에서는 왜 코딩 테스트를 거칠까요?

실제 개발 현업에서, 개발을 잘 하는 모든 개발자가 알고리즘 문제풀이를 잘 하지는 않습니다.

DFS/BFS, Dijkstra, Kruskal 등 이름만 들어도 어려운 알고리즘을 사용하는 경우도 있지만, 그렇지 않고서도 개발을 잘 하는 경우도 있습니다.

그럼에도 코딩 테스트가 현재 개발자 채용의 중심이 된 데에는 몇 가지 이유가 있습니다.

  • 지원자의 개발 능력을 확인할 수 있다. 면접/포트폴리오가 아무리 훌륭해도, 실제로 채용해 놓고 보니 개발을 어려워하는 경우가 많이 있다.
  • 문제해결능력 검증. 코딩 테스트는 결국 '주어진 문제를 얼만큼 잘 해결할 수 있느냐'를 평가하게 됩니다. 실무에서는 무수히 많은 문제를 마주하게 되는데, 이를 어떠한 관점을 가지고 해결하는지 평가할 수 있습니다.
  • 신입 개발자를 평가할 수 있는 효과적인 수단이다.

보통 개발자 채용 공고는 전공/학력/학점이 크게 중요하지 않은 경우가 많습니다. 네이버/라인의 경우 학사 졸업자만 받고, 삼성전자의 경우 출신 전공 역시 관련 전공 출신만 받는 등 제한이 있는 경우도 있지만, 카카오/NHN처럼 이름/이메일/전화번호만 입력하면 접수가 끝나는 경우도 있습니다.

그러다 보니 이들을 동일한 기준선상에서 한 번에 공정하게 평가하기에 코딩 테스트가 매우 효과적인 수단이 된 것입니다.

전공, 학력, 학점에 관계 없이, 기업에서 제시한 일정 기준 이상의 성적을 기록한 지원자를 대상으로 서류/면접을 통해 평가하는 것입니다.

특히나 신입 지원자는 경력 등 다른 평가할 요소가 부족하다 보니, 보통 코딩 테스트 난이도는 경력보다 신입이 더 높습니다.

 

따라서 코딩 테스트는 개발자 취업의 필수이자 기본입니다.

코딩 테스트를 합격해야 서류/면접에서 본인의 장점을 어필할 기회가 생깁니다.

 

1. 필요한 배경지식

여기서는 코딩 테스트에 대해 아무것도 모르는 분이 읽는다고 가정하고 글을 작성하겠습니다.

 

코딩 테스트에서 필요한 배경 지식은 크게 두 가지로 나뉩니다: 자료구조, 알고리즘.

 

자료구조란, 컴퓨터 상에서 데이터의 집합을 나타내기 위한 다양한 구조입니다.

데이터는 컴퓨터 상의 메모리에 단순히 일렬로 나열되는 것이 아니라, 사용자가 미리 제시한 구조를 따라 저장됩니다.

어떤 자료구조는 가장 최근에 저장된 값을 알아 보기에 좋으며, 어떤 자료구조는 같은 값이 중복 저장 되는것을 방지합니다. 또, 어떤 자료구조는 값을 넣을 때마다 기준에 맞게 정렬되고, 이 정렬은 사용자가 직접 정렬하는 것보다 더 빠르고 효율적으로 이루어집니다.

 

이 중 코딩 테스트에서 보편적으로 활용되는 자료 구조는 아래와 같습니다.

  • 배열 (array)
  • 리스트, 벡터 (vector) (수학에서 나오는 '크기와 방향을 갖는 값'과는 이름만 같고 다른 개념입니다.)
  • 연결 리스트 (linked list)
  • 스택 (stack), 큐 (queue), 덱 (deque)
  • 우선순위 큐 (priority queue), 힙 (heap)
  • 트리 구조 (tree)
    • 이진 트리 (binary tree)
  • 그래프 (graph)
    • 정점 (node)과 간선 (edge)
    • 양방향 간선, 단방향 간선
  • 셋, 맵
    • C++: 셋 (set), 맵 (map), unordered set, unordered map
    • Java: tree set, tree map, hash set, hash map
    • 해시 함수 (hash function)의 정의와 개념

(이 외에 추가하면 좋을 내용이 있다면 알려 주세요.)

 

알고리즘이란, '목표하는 값을 얻기 위한 단계적 해결 과정' 을 뜻합니다.

또는 사전적인 정의로, 어떠한 문제를 해결하기 위해 정해진 일련의 절차나 방법이라고도 합니다 (출처: 위키피디아).

코딩 테스트에서 알고리즘이란, 위에서 언급한 정의와 마찬가지로, 특정 값을 얻기 위해 사용됩니다.

예를 들어, '출발지로부터 목표 지점까지의 최단 거리를 구하는 알고리즘', '주어진 값을 항상 일정한 안정성을 가지고 빠르게 정렬할 수 있는 알고리즘', '값 사이의 집합 관계를 구하는 알고리즘' 등이 있습니다.

 

보편적으로 사용되는 알고리즘은 아래와 같습니다.

  • 단순 구현
  • 탐욕법 (greedy method)
  • 브루트 포스 (brute force) - 모든 경우의 수를 시도해 보기
  • 깊이 우선 탐색 (depth first search; DFS), 너비 우선 탐색 (breadth first search; BFS)
  • 정렬 (sort)
  • 이진 탐색 (binary search)
  • 동적 계획법 (dynamic programming)
  • 다익스트라 알고리즘 (Dijkstra algorithm)
  • 크루스칼 알고리즘 (Kruskal algorithm)

그 외에 플로이드-와셜 알고리즘 (Floyd-Warshall algorithm), 세그먼트 트리 (segment tree)처럼 가끔 등장하는 알고리즘도 있습니다.

 

위 자료구조/알고리즘을 모두 알아야 할까요?

네, 모두 알아야 합니다. 적어도 제가 위에서 적은 내용들은 전부 알고 계셔야 합니다.

알고 있다는 것은, 각각의 동작 방식을 이해하고, 백지에 적어 낼 수 있고, 시간 복잡도가 어떠한지 알고 계셔야 합니다.

 

위에서 언급한 내용 외에 추가적으로, '알고리즘의 시간/공간 복잡도'의 개념에 대해서도 아셔야 합니다.

여기까지 전부 이해하셨으면, 코딩 테스트에 필요한 기본 지식은 거의 알고 계신 셈입니다.

 

2. 문제풀이

앞에서 언급한 자료구조와 알고리즘을 바탕으로, 많은 문제를 풀어 보셔야 합니다.

알고리즘 문제풀이는 고등학생 시절에 수능 수학을 준비하던 때와 아주 비슷합니다. 문제를 일련의 절차를 거쳐서 답을 구하게 되며, 다양한 유형의 문제를 많이, 정말 많이 풀어보실수록 실제 시험에서 유리합니다.

 

이러한 문제는 아래와 같은 사이트에서 많이 접할 수 있습니다.

이 외에도 많은 사이트들이 있지만, 백준과 프로그래머스에 있는 문제들만 풀어 보셔도 충분히 학습이 가능합니다.

여기서부터는 백준과 프로그래머스를 기준으로 말씀드리겠습니다.

 

백준에는 굉장히 많은 문제들이 있습니다. 이 문제들 중 어떤 문제는 굉장히 쉽지만, 어떤 문제는 푼 사람이 한 명밖에 없을 정도로 어렵습니다.

또, 문제들은 각자 요구하는 알고리즘이 다릅니다. 이러한 알고리즘에 따라 문제가 분류되어 있기도 합니다.

백준은 서드파티 사이트인 solved.ac를 통해 문제의 난이도 등급을 표시할 수 있습니다. 이 서비스를 사용하면, 각 문제의 난이도를 직관적으로 볼 수 있고, 내가 현재 어느 정도인지 대략 파악이 가능합니다.

 

solved.ac 사용 설정

https://solved.ac/profile/kchung1995

 

solved.ac

알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 난이도 및 티어 정보 제공

solved.ac

저 역시 solved.ac를 적극적으로 활용할 수 있습니다.

위처럼 solved.ac 프로필 페이지에 가면, 내가 어떤 문제를 많이 풀었는지, 내 등급은 어떠한지 등을 한 눈에 확인할 수 있고, 이를 활용하여 향후 알고리즘 학습 계획을 세울 수 있습니다.

 

다음으로 프로그래머스입니다.

프로그래머스에 대해 알아보기 전에, 백준과 프로그래머스를 비교한 표를 먼저 보고 가시죠.

 

  Baekjoon Online Judge Programmers
코딩 테스트 환경 X O
문제 수 아주 많음 보통
대기업 기출 문제 삼성 카카오
커뮤니티 매우 활성화 되어 있음 보통

 

프로그래머스가 백준에 비해서 가지는 장점은 명확합니다.

  • 실제 코딩 테스트 환경 그 자체입니다. 많은 회사들에서 신입 개발자 채용 시에 프로그래머스를 통해 코딩 테스트를 진행합니다.
  • 카카오에서 출제된 모든 기출 문제를 제공합니다.

위 두 가지의 이유만으로 프로그래머스에서 문제를 풀어 봐야 한다는 이유는 충분하다고 생각합니다.

 

프로그래머스에서는 '코딩테스트 고득점 kit' 이라는 문제 모음을 제공합니다.

또, 문제별로 난이도 레벨을 표시해 주는데, 난이도 Level 1 ~ Level 5까지 총 5개로 분류되어 있습니다.

 

위 두 환경에서 다양한 문제를 풀어 보는 것으로 코딩 테스트 대비를 위한 문제풀이를 충분히 진행할 수 있습니다.

 

3. 코딩 테스트 환경

문제 풀이를 연습할 때외 실제로 코딩 테스트를 볼 때는 주어진 환경에 차이가 있을 수밖에 없습니다.

이를 최대한 비슷한 환경에서 대비해 보는 것 역시 좋은 전략이 되겠지요.

 

실제로 우리가 보는 코딩 테스트는 어떤 플랫폼에서 보게 될까요?

위에서 약간 언급했지만, 보통 아래와 같은 플랫폼들이 존재합니다.

  • 프로그래머스 (신입 공채의 경우 가장 대중적)
    • 네이버, 카카오, 라인, SKT, ZUM, 등등
  • 구름 IDE
  • HackerRank
  • Codility (경력 채용의 경우 대중적)

각 환경을 모두 대비할 수는 없지만, 특징을 알고 있으면 당황하지 않고 실제 테스트를 진행할 수 있습니다.

  • 프로그래머스
    • 입출력을 따로 구현할 필요가 없음. solution 함수를 완성하면 되고, 입력이 solution 함수의 parameter로 주어짐.
    • 채점 속도가 굉장히 안정적이고 빠름. 실행 한 번 누르면 모든 테스트 케이스를 실행함.
    • 안정적임
  • 구름 IDE
    • 입출력을 따로 구현해야 함.
    • 채점이 느리거나 불안정할 때가 있음.
  • HackerRank
    • 문제가 영어로 주어짐.
    • 입출력을 따로 구현할 필요가 없음.
    • 채점 속도가 빠름 (프로그래머스보다는 약간 느림)

Codility는 제가 경험해 본 적이 없어서... 추후 갱신하도록 하겠습니다.

 

코딩 테스트는 많은 경우, 무감독으로 진행됩니다. 네카라 중에서도 카카오, 네이버는 아무런 감독 기능을 켜지 않은 채 진행됩니다.

부정행위 할 수 있는거 아냐? 라는 생각이 드실 텐데, 물론 가능은 할 것입니다.

하지만 이런 회사들의 경우 이후 면접 등에서 코딩 테스트 리뷰를 반드시 진행하기 때문에, 부정행위를 했다면 이후 면접에서 작성한 코드에 대해 제대로 설명할 수 없게 됩니다.

따라서 답안을 공유하는 등의 부정행위는 하지 말고, 간단한 책/인터넷 검색 정도만으로 진행하시면 됩니다 (물론 지원하신 기업의 코딩 테스트 규정을 반드시 확인하세요).

 

네이버의 경우에는 온라인 감독 기능을 켜고 진행하는데요. 보통 화면 공유 + 웹캠 + 폰 카메라를 전부 켜고 진행하게 됩니다.

따라서 웹캠 및 휴대폰을 세워둘 수 있는 거치대가 필요하며, 보통 이러한 시험 중에는 공식 레퍼런스 문서를 제외한 인터넷 검색도 제한되는 경우가 많습니다.

 

또, 많은 코딩 테스트에서 IDE에서의 복사-붙여넣기를 허용합니다.

즉, 로컬 IDE (Visual Studio, VS Code, XCode, IntelliJ 등)에서 코드를 작성한 뒤, 붙여넣는 식으로 제출을 할 수 있습니다.

다만 저는 이런 방법은 추천하지 않는 편인데요.

  • 붙여넣기를 막아 놓는 경우가 종종 있습니다 (예: NHN).
  • 붙여넣으면서 로컬에서는 발견되지 않았던 문제가 발견되는 경우가 있습니다.
  • 코드를 여러 곳에서 작성하다 보면, 로컬에서는 수정한 내용이 실제 시험 환경에는 반영이 안 된 채로 제출하는 경우도 존재합니다.

이러한 이유로 저는 온라인 시험 환경 상에서 코드를 직접 작성하는 것을 선호하는 편입니다.

 

4. 제가 경험한 내용에 기반한 추천

앞에서는 코딩 테스트란 어떤 것이고 왜 보는지, 어떤 배경 지식이 필요한지, 어떻게 대비할 수 있는지에 대해 포괄적인 내용을 다루었습니다.

여기서는 실제로 제가 어떻게 준비했고, 어떤 방법을 추천하는지 다루어 보고자 합니다.

 

알고리즘/자료구조 학습

저는 대학 재학 중 자료구조 (2학년), 알고리즘 (4학년) 수업을 들었지만, 두 과목 모두 성적이 좋은 편이 아닙니다 (C+).

따라서 본격적으로 코딩 테스트를 준비하기 이전에는 '대략 이런 자료구조와 알고리즘이 있다' 정도만 알고 있는 상태였습니다.

DFS/BFS라는 이름을 들어는 봤지만, 실제로 구현 및 활용은 하나도 하지 못했습니다.

따라서 취업 준비를 하면서 맨 처음 준비한 과정은 자료구조/알고리즘 학습인데요.

 

저는 '이것이 취업을 위한 코딩테스트다 with 파이썬' 이라는 책을 중심으로 공부하였습니다.

이 책은 저보다 경험이 훨씬 많으신 저자분께서 경험하고 분석한 내용을 바탕으로 쓰신 책인데요.

각 자료구조/알고리즘 내용을 먼저 설명하고, 그에 관련된 예제 및 실제 문제를 제시하는 식으로 쓰여 있습니다.

책에는 Python으로 작성된 답안 코드가 실려 있고, GitHub에서는 C++와 Java로 작성된 답안 코드까지 확인할 수 있습니다.

이 책을 다회독 하며, 알고리즘 문제풀이의 기본기를 다졌고, 이후 추가적인 문제 및 기출문제를 풀어 보는 식으로 진행하였습니다.

또, 특정 알고리즘에 대한 추가적인 지식이 필요한 경우, 책 또는 인터넷을 참고하여 학습하였습니다.

 

적정 난이도 및 문제 모음

알고리즘을 대부분 학습하셨고, 문제를 많이 풀어 보고자 하신다면, 어떤 문제를 풀어야 할지 막막하실 텐데요.

우선 어느 정도 수준까지 풀 수 있어야 하는지 궁금하실 겁니다.

 

백준 기준 골드, 프로그래머스 기준 Level 2까지 문제들을 무난하게 푸실 정도면 대부분의 코딩 테스트에 합격하실 수 있습니다.

기업에서 코딩 테스트를 실시하는 이유는, 알고리즘 마스터를 뽑고자 함이 아닙니다. 앞에서 언급했던 바와 같이, '기본적으로 이 정도 이상 되는 지원자들에 대해 서류/면접 평가를 하겠다'입니다.

따라서 너무 어려운 문제까지 다 푸실 수 있어야 하는 것은 절대 아님을 유념해 주세요. 실제로 백준 플래티넘 이상부터는 문제 풀이를 위해 특정 알고리즘을 학습하는 경우가 발생할 수 있습니다.

 

이러한 문제를 모아 둔 곳이 없을까요? 당연히 있습니다!

저는 아래 두 가지 경우를 소개해 드리고자 합니다.

코딩 테스트 스터디 그룹의 경우, 제가 참여했던 스터디입니다. 현재는 문제 갱신이 종료되었지만, 매주 4개 문제씩 58주차까지 진행이 되었고, 그 외에도 각종 공채 등에 출제되었던 문제가 수록되어 있습니다.

여기에 실려 있는 문제들을 풀어 보시는 것을 추천합니다. (가끔 플래티넘 이상의 과한 난이도의 문제가 있는데 이런 문제는 눈치껏 거르시면 됩니다.)

또는 GitHub에는 다른 수많은 알고리즘 스터디가 있습니다. 이런 스터디에 참여하시는 것 역시 좋은 방법이 되겠지요.

 

프로그래머스에서는 Level 1, 2 문제들을 풀어 보시는 것을 추천합니다.

특히 카카오 기출문제들 중에서 Level 2 문제들은 다른 Level 2 문제들보다 어려운 편인데, 이러한 문제들까지 전부 푸실 수 있다면 카카오 1차 코딩 테스트까지는 무난하게 합격하실 수 있을 것입니다.

제 블로그에도 대부분 백준 골드/프로그래머스 Level 2 문제들에 대한 풀이가 올라와 있습니다.

 

학습법

흔히 이런 질문들을 하시곤 합니다.

어떤 문제에 대해 4시간이나 고민해 봤는데도 못 풀겠어요. 해설을 봐도 될까요, 아니면 더 고민해 보는게 맞을까요?

저는 '해설을 보세요' 라고 말씀 드리고 싶습니다.

취준생 분들에게 시간은 금입니다. 어떤 문제에 대해 2~3시간 이상 고민해 보셨는데 풀지 못하셨다면, 그 문제는 아마 풀기 위해 추가적인 학습이 필요하실 확률이 높습니다.

다만 해설을 보고 복붙하라는 말은 당연히 아닙니다.

  1. 해설을 보기 전에, 어떤 부분에서 막혔는지 먼저 파악하시고,
  2. 해설을 보시면서, 막혔던 부분을 어떻게 해결했는지 눈여겨 보세요.
  3. 이후, 해설을 보지 말고, 막혔던 부분을 직접 해결해 보세요.
  4. 약 1주일 후, 비슷한 유형의 문제를 찾아서 다시 풀어 보세요.

많은 문제들은 구글에 검색하면 다양한 사람들의 풀이를 참고할 수 있습니다.

그 풀이를 보면서 해결법을 참고하는 것은 좋지만, 이를 완전히 스스로의 것으로 만들어야 학습했다고 할 수 있겠죠.

그런 의미에서, 위와 같은 과정을 거치면 스스로의 것으로 만들기 유리합니다.

그리고, 절대로 문제를 보자마자 모르겠다고 판단하지 마세요. 충분히 고민해 보는 것이 우선입니다.

실제로 처음에 봤을땐 막막한 문제도, 차분히 접근하다 보면 풀 수 있는 경우가 종종 있습니다.

 

다음으로 제가 강조하고 싶은 것은 기록입니다.

학습한 내용을 기록하는 것 역시 저는 굉장히 좋은 전략이라고 생각합니다.

'글을 작성하다 보면 시간이 오래 걸려요. 그 시간에 문제 하나 더 푸는게 낫지 않나요?' 라고 생각하실 수 있습니다.

사람의 기억은 완전하지 않다 보니, 예전에 어렵게 풀었던 문제라도 지금은 기억이 잘 나지 않을 수 있습니다.

이 때 예전에 작성해 둔 글을 보면, 기억을 더 쉽게 되살릴 수 있습니다. 다른 사람도 아니고 본인이 스스로 작성한 글이라면 더더욱요.

또, 학습한 내용을 글이라는 체계적인 형태로 기록해 두면서, 다시 한 번 머릿속에서 내용이 정리가 됩니다.

코드는 GitHub에 모아 두시고, 문제를 풀면서 어려웠거나 고민한 점, 해결한 방법 등에 대해 정리해 보세요.

 

5. 마치며

코딩 테스트 준비를 위해 공부하며 저도 많은 실패와 좌절을 겪었습니다.

하지만 개발자에게 실패와 좌절은 일상이라고 생각합니다. 실패와 좌절을 겪는 만큼 성장하고, 배우게 됩니다.

그 첫 단계가 코딩 테스트를 준비하는 과정이라고 생각합니다. 많이 틀리고, 실패하고, 고민해 보세요.

 

이 글을 통해 많은 분들이 개발자로써 첫 도전의 관문인 코딩 테스트를 통과하는데 도움이 되시길 기원합니다.

댓글