코딩 테스트?

코딩 테스트란 개발자의 기술적인 역량을 시험하기 위해 실시하는 알고리즘이나 구현을 요구하는 테스트다.

회사 입장에서는 지원자를 평가하는 최소한의 기준이고 지원자에게는 통곡의 벽 처럼 느껴지는 코딩 테스트 대체 왜 해야할까?

그리고 또 어떻게 준비해야만 할까..?

코딩 테스트 그래서 왜 해야하나?

무엇보다도, 많은 회사들이 코딩테스트를 1차적인 관문으로 두고 지원자를 거르고 있기 때문에 그런 회사들에 지원할 생각이 있다면 꾸준히 준비하는 게 좋다.

아래 4가지 이유를 통해서 조금 더 자세히 알아보자면..

  • 여러분들이 가고 싶어하는 많은 회사에는 정말 많은 지원자가 몰린다. 이들 개개인의 모든 역량을 테스트하기에는 현실적으로 무리가 있고, 이 과정에서 코딩 테스트는 효율적으로 이들을 가려내는데 도움이 되기 때문에 많은 기업들이 도입한다.
  • 여러분들이 어떤 식으로 코드를 작성하는지 미리 확인하고 어떤 사고 방식과 결론, 평소 개발을 어떻게 하는지 엿볼 수 있는 창구와 비슷하다. 자신이 어떤 개발자인지 비교적 손 쉽게 다른 개발자들에게 보여줄 수 있다.
  • 개발에 필요한 지식들을 보여주고 나의 컴퓨터 과학 지식을 기반으로 한 나의 문제 해결력을 보여주기 쉽다. 결국 알고리즘 문제를 구현한다는 건 그 문제를 이해해야만 할 수 있는 거고, 그에 맞는 알고리즘을 찾고 시간 내에 테스트 케이스들을 통과시켜야 하기 때문에, 비교적 쉽게 내 문제 해결 능력을 보여줄 수 있다.
  • 개발자는 자주,, 생각보다 자주 이직이라는 카드를 꺼내든다.. 이직할 때 코테 준비를 하지말고,, 항상 이직이라는 카드를 꺼낼 수 있도록 언제든 코테를 준비를 할 필요가 있다.

당신이 코딩테스트를 포기하는 7가지 이유

아래의 7가지 이유는 한정수님비전공자를 위한 개발자 취업 가이드의 내용에서 가져온 개발자들이 코테를 포기하는 7가지 이유이다.

가져온 이유들에는 각각 논리적인 허점이 존재하고 우리는 같이 그것을 깨부수고 코딩테스트를 준비하기 위한 마음가짐을 잡아 보도록 하자.

  1. 코딩 테스트를 보는 회사에는 어차피 서류 합격도 못할 것이다.

아니다. 서류만 내도 코테를 보게 해주는 회사가 많고 “서류”도 영향이 있지만 “테스트 결과” 도 영향이 있다.

  1. 코딩 테스트를 준비할 시간이 없다.

분명히 당신의 하루에는 낭비되는 시간이 있다. 그 시간을 찾아서 하자. 코딩 테스트 준비 뿐만아니라 다른 공부도 마찬가지다..

  1. 지금부터 준비하더라도, 더 오래 준비한 전공자들에게 밀릴 것이다.

체육 전공한 사람이 마라톤을 더 잘 뛸까? 아니면 일반인이 더 잘 뛸까? 확률은 전자가 높겠지만 거의 비슷하게 힘들다. 전공자들이라고 해서 코테가 쉽고 뚝딱 풀리는 일은 아니다.

  1. Java(언어), Spring(프레임워크)도 제대로 못하는데 무슨 코딩 테스트?

코딩 테스트라도 제대로 해야지 면접은 볼 수 있지 않을까? 물론 둘 다 잘하면 정말 좋고 그것도 아니라면 면접에 들어갈 수 있는 실력이 된다는 것 자체로도 의미가 있다고 생각한다. 코테를 볼 기회는 항상 찾아오는게 아니니…

  1. 코딩 테스트 안봐도 개발로 취업은 하더라.

당연히 할 수 있다. 하지 않는 기업을 찾아서 지원하면 된다. 하지만 차라리 코테를 준비하고 더 많은 기회를 얻는게 맞지 않나 라는 생각이 든다.

  1. 조금 해봤는데, 너무 어렵다.

착각하는 분들이 있는데 우리는 대회를 나가자고 하는 게 아니다. 코테를 쳐보는 것만으로도 소중한 자산이다. 이걸로 상을 타는 게 아니라 우리는 취업이 목적이기에….

  1. 어떻게 준비해야 될지 모르겠다.

그러면 이제부터 알아보자! 만약 필자가 뭐하는 사람인지 의심이 간다면.. 그래도 나름 열심히(?) 준비해오고 알고리즘을 좋아하고, 알고리즘 스터디를 운영 중인 사람 중 하나로서 여러분들이 코테에서 더 행복해지길 바라는 마음에서 준비했다.

코딩테스트 어떻게 준비해야 할까?

1. 알고리즘 / 자료구조를 배우자

코딩 테스트에 나오는 문제는 다양한 배경 지식을 요구하고 그 중 만나게 되는 대부분은 자료 구조와 다양한 알고리즘이다.

따라서, 무턱대고 문제를 풀기위해 접근 하는 것보다는 미리 아래의 자료구조와 알고리즘과 친숙해진 이후로 풀어보길 시작하는 것을 권장한다..

그 중에 보편적으로 활용되는 자료 구조와 알고리즘은 다음과 같다.

자료구조

  • 배열 (Array)
  • 리스트 (List)
  • 연결 리스트 (LinkedList)
  • 스택 (Stack)
  • 큐 (Queue)
  • 덱 (Deque)
  • 우선순위 큐 (Priority Queue), 힙 (Heap)
  • 트리 (Tree), 이진 트리(Binary Tree)
  • 그래프 (Graph)
  • 세트 (Set)
  • 맵 (Map)
  • 서로소 집합 (Disjoint Set / Union Find)

위에 있는 자료 구조들을 모두 아는 편이 좋은가요?

위 자료 구조들은 기술 면접 때도 자주 만날 수 있으니 말로 설명할 수 있을 만큼 알아 두는 편이 좋다. 당연히 문제를 만났을 때 위의 자료구조를 각 프로그래밍 언어별로 어떤 식으로 사용할 수 있는지도 알아두어야 문제에 적용할 수 있다.

알고리즘

  • 그리디 (Greedy)
  • 동적 계획법 (Dynamic Programming) : 메모이제이션…
  • 다양한 정렬 알고리즘 : 버블, 선택, 삽입, 병합, 힙, 퀵
  • 탐색 알고리즘
    • 깊이 우선 탐색 (DFS)
    • 너비 우선 탐색 (BFS)
    • 이진 탐색
    • 매개 변수 탐색
    • 트리에서의 탐색 : 힙 트리, 트라이(Trie)
  • 크루스칼 알고리즘 (최소 신장 트리)
  • 백트래킹
  • 최단 경로 : 다익스트라, 벨만-포드, 플로이드-워셜
  • 완전 탐색 (Bruteforcing)

알고리즘과 마찬가지로 위에 있는 내용들도 전부는 아니지만 말로 설명할 수 있어야 한다.

알고리즘 공부를 시작하고 싶은데 어디서부터 보는게 좋을까요?

개인적으로 방법은 중요하다고 생각하지 않고 꾸준히 보는게 더 낫다고 생각하지만 그래도 몇 가지 강의 및 책을 추천해보자면,

이것이 코딩 테스트다

BaaaaaaaarkingDog님의 실전 알고리즘 강좌

2. 꾸준히 풀자

너무나도 당연한 말이지만 생각보다 코딩 테스트는 언제든 볼 수 있게끔 준비를 해놓는 상태가 훨씬 좋다고 생각한다. 꾸준히 준비하지 않으면 실력이 떨어지는 속도는 가파르지만 실력을 올리는 속도는 생각보다 더 걸릴 수 있다.

따라서 사람들이 자주 사용하고, 실제 코딩 테스트 환경에 가까운 곳에서 자주 문제를 풀어보기를 권장한다.

  • 프로그래머스 : 많은 기업들의 코딩 테스트를 진행해주고 있고 문제도 꾸준히 올라온다. 카카오 등의 기업 공채에서의 기출 문제 또한 제공하고 있다.
  • SW Expert Academy : 삼성에서 운영하는 코딩테스트 및 알고리즘 학습 사이트이다. 삼성 관련 (반기 마다 열리는 알고리즘 특강, 입사 시 코딩 테스트)가 모두 여기에서 요구하는 문제 입출력 방식이나 라이브러리를 어떤 것을 사용할 수 있는지 까지 미리 알고 준비할 수 있다.
  • Baekjoon Online Judge : 다양한 문제를 제공하고 삼성 SW 역랑 기출 문제를 제공하고 있다. 압도적인 문제 수와 유저 수로 인해 문제를 풀지 못했을 때 물어볼 곳이 더 많다는 이점이 있다.

개인적으로는 백준을 제일 좋아하고 애용한다. 꾸준히 풀기를 지키기 위해서는 나름의 보상이 필요하다고 생각하는데.. 필자는 꾸준히 풀기 위해 코딩 테스트를 나름의 게임이라고 생각하여 위 백준 사이트와 연동되는 solved.ac를 활용하여 꾸준히 잔디 심기(?) 및 랭크를 통해서 코딩 테스트를 준비중이다.

3. 실제로 구현하기 전에 어떻게 구현할 지 손으로 적어보자

아는 문제가 나와서 구현부터 할 생각할지 말고 무엇부터 어떻게 구현할지 생각해보고 문제 풀이를 작성해보자.

  1. 요즘 코딩 테스트에 나오는 문제들은 설명이 길다. 미리 순서를 정해두지 않고 구현만 하다가 보면 중간에 갈 길을 잃기 쉽고 문제 설명 중 어디까지 구현했는지 추적할 수가 없다. 결국 다시 되돌아가서 문제를 읽어야 할 수 도 있다. 처음부터 모든 상황을 본인의 언어로 정리해둔다면, 헷갈릴 이유도 없고 본인이 어디까지 구현했는 지 추적이 가능하다.
  2. 대부분의 코딩 테스트는 펜과 종이를 허용한다. 이걸 준비하라고 하는 이유는 써서 고민해봐도 좋다는 얘기고 이것을 활용하지 않을 이유가 없다!
  3. 많은 수의 기업이 코딩 테스트에 대한 기출문제를 제공하지 않는다. 따라서 직접 적어 놓은 문제 구현 계획을 보고 나서 나중에 복기할 수 있도록 한다.

4. 시간 분배를 잘하자.

  1. 문제를 풀기 전에 시간 복잡도 계산을 해보고 올바른 알고리즘을 골랐는지 생각해보자. 보수적으로 생각했을 때 연산이 1억번을 1초라 가정하면 대부분의 문제에서 시간 초과를 받지 않을 수 있다. 어떤 알고리즘을 사용할지 입력의 최대 범위는 어디까지인지 시간은 얼마나 주어졌는지를 복합적으로 고려해보고 문제를 풀어야 한다.
  2. 실제 시험도 마찬가지지만 문제 당 시간 분배가 중요하다. 최악의 경우 2시간 내에 4문제를 풀어야할 수도 있고 그거 보다 길거나 짧을 수 있다. 평균적으로 실전에서는 40분 ~ 1시간이 주어진다고 생각하고 문제를 접근해야 테스트 중 시간이 모잘라서 문제를 포기하는 불상사를 겪지 않을 수 있다.
  3. 여느 시험을 볼 때와 마찬가지로 너무 오래 걸리는 문제만 붙잡고 있지 말아야 한다. 모든 답안을 다 들고 시험장에 갈 수 없듯이 코딩테스트도 못 푸는 문제가 있을 수 있다. 그럴 땐 넘기고 시간이 남을 때 돌아보는게 정신건강에 훨씬 더 좋다.
  4. 앞의 내용의 연장선에서 대부분의 코딩테스트는 순서대로 풀지 않아도 된다. 처음에 문제를 받는다면 쭉 훑어보고 해당 문제의 알고리즘이 바로 보이거나 구현이 오래 걸리지 않을 것 같은 문제들을 빨리 풀고 시간을 아끼는 게 좋다!

참고 자료

이것이 코딩 테스트다, 나동빈 저, pg 46 - 50

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

알고리즘 분류 참고 - 백준 온라인 저지 알고리즘 별 문제 분류