brunch

You can make anything
by writing

C.S.Lewis

by 엄지현 Jul 11. 2022

코딩 테스트 4단계 공부법

개발자 코딩 테스트 준비 방법

코딩 테스트는 개발자 면접의 꽃입니다. 기술 면접에서 가장 흔하게 볼 수 있는 방식이지만, 동시에 가장 어려운 방식이기도 하죠. 코딩 테스트에 나오는 알고리즘 문제는 그냥 혼자서 풀기도 힘든데, 짧은 제한 시간 내에 풀어야 한다는 압박까지 더해지니 어려울 수밖에요. 특히 라이브 코딩 테스트의 경우 면접관이 지켜보고 있다는 부담감 때문에 더 힘겹게 느껴집니다. 그러나 저번 글에 말씀드렸다시피 준비만 잘하시면 이렇게 어려운 코딩 테스트에서도 좋은 결과를 보실 수 있습니다. 


이번 글에서는 코딩 테스트를 준비하는 방법을 4단계로 나누어 소개드립니다.


1. 자료구조 및 알고리즘 공부하기 

2. 빅오 표기법 마스터하기 

3. 알고리즘 문제 풀어보기

4. 결과 분석하기





1단계: 자료구조 및 알고리즘 공부하기

코딩 테스트에 제대로 대비하기 위해서는 연습 문제를 풀기에 앞서 이론을 탄탄히 다지는 단계가 필요합니다. 이론을 공부하지 않고 닥치는 대로 연습 문제만 푸는 것은 부실한 토지에 건물을 올리는 것과 같습니다. 건물을 높게 쌓을수록 토지의 부실함이 드러나 모든 게 무너지겠죠. 반면에 이론이라는 토지를 탄탄히 다져놓으면 그 위에 어떤 높은 건물을 쌓아도 든든히 버텨줄 것입니다.


코딩 테스트에서는 보통 단시간 안에 풀 수 있는 알고리즘 문제가 출제되는데요, 이런 유형의 문제를 풀기 위해서는 기본 자료구조 및 자주 사용되는 알고리즘 개념을 알아두어야 합니다. 수많은 자료구조와 알고리즘 개념 중 반드시 공부해야 하는 주제 몇 가지를 선정해 보았습니다.


자료구조

배열 (Array)

해시 테이블 (Hash Table)

연결 리스트 (Linked List)

스택 (Stack)

큐 (Queue)

힙 (Heap)

트리 & 그래프 (Tree & Graph)


알고리즘

이진 탐색 (Binary Search)

정렬 (Sorting)

재귀 (Recursion)

너비 우선 탐색 (BFS)

깊이 우선 탐색 (DFS)

백트래킹 (Backtracking)

동적 계획법 (Dynamic Programming)


각 주제에 관한 설명은 수많은 책, 블로그, 영상 강의에 자세히 나와 있으니 각자 잘 맞는 방식을 선택해서 공부하시면 됩니다. 참고로 제가 자료구조와 알고리즘에 관해 공부할 때 개인적으로 많은 도움을 받았던 건 HackerRank의 유튜브 채널이었습니다. 이 채널에서는 코딩 면접의 바이블이라 불리는 <코딩 인터뷰 완전정복(원제: Cracking the Coding Interview)>의 저자 Gayle Laakmann McDowell이 직접 자료구조에 대한 설명을 해줍니다. 더불어 어떤 알고리즘 문제를 풀 때 해당 자료구조를 쓰면 좋은지 실질적인 예제를 통해 보여주기 때문에, 실제 문제를 풀 때 참고하기 좋습니다. (자료구조 영상 / 알고리즘 영상)




2단계: 빅오 표기법 마스터하기

알고리즘 문제를 푸는 방식은 딱 한 가지로 정해져 있지 않습니다. 하나의 문제도 여러 방식으로 풀 수 있기 때문에 어느 한 가지 방식만이 정답이라고 할 수는 없습니다. 답이 여러 개 있는 셈이죠. 그러나 더 효율적인 답을 가려낼 수는 있습니다. 일반적으로는 더 짧은 시간 안에(시간 복잡도), 더 적은 메모리를 사용하면서(공간 복잡도) 문제를 해결하는 코드가 더 효율적인 답입니다.


이러한 시간 및 공간 복잡도를 나타내는 대표적인 방법이 빅오 표기법(Big-O Notation)입니다. 개발자는 본인이 구현한 코드를 빅오 표기법을 이용해 분석할 수 있어야 합니다. 라이브 코딩 테스트 때 면접관이 “이 코드의 시간 복잡도는 어떻게 되나요?”라는 질문을 하면 막힘없이 대답할 수 있어야 하며, 시간 복잡도와 공간 복잡도의 거래 관계(trade-off)를 이해해야 합니다. 아직 이게 익숙지 않다면 충분한 연습을 통해 빅오 표기법을 마스터하시기 바랍니다.


각 자료구조 및 알고리즘의 빅오 표기법:


빅오 표기법 연습 문제:




3단계: 알고리즘 문제 풀어보기

기본 자료구조와 자주 쓰이는 알고리즘, 빅오 표기법까지 공부했다면 이제 알고리즘 문제를 풀어볼 차례입니다. 코딩 테스트는 문제만 많이 풀어보면 된다고 생각하시는 분들이 많습니다. 그런데 어느 문제를, 무슨 프로그래밍 언어를 사용해서, 어떤 순서로 풀어야 할까요? 본격적으로 문제를 풀기 전에 아래 세 가지를 정하고 시작하시길 권장드립니다.


1. 프로그래밍 언어 선택하기

면접을 볼 프로그래밍 언어는 본인에게 가장 편하고 익숙한 언어로 선택하시는 게 좋습니다. 우리가 영어를 쓸 때보다 한국어를 쓸 때 더 수월하게 말이 나오듯이, 모국어처럼 편하게 느껴지는 프로그래밍 언어를 사용해야 긴장되는 면접 환경에서도 버벅거리지 않고 코드를 쓸 수 있습니다. 회사마다 사용하는 프로그래밍 언어가 다 다르기는 하지만, 회사에서 지원자가 선택하는 언어로 면접을 보도록 배려해주는 경우가 많습니다. 보통 지원자들이 면접용으로 많이 선택하는 언어로는 Java, Javascript, Python이 있습니다.


2. 알고리즘 기출문제 플랫폼 정하기

국내외 다양한 사이트에서 코딩 테스트에 나올만한 알고리즘 기출문제를 무료로 제공합니다. 이 중에서 자신에게 맞는 플랫폼을 정해서 거기에 나오는 기출문제를 풀어보면 됩니다. 대표적으로 많이 쓰이는 알고리즘 기출문제 플랫폼은 아래와 같습니다.


국내:   

프로그래머스

백준

삼성 SW Expert Academy


해외:   

LeetCode

HackerRank

Codility


개인적으로는 영국에서만 코딩 테스트를 봐와서 국내 사이트는 거의 이용해 보지 않았는데요, 해외 사이트 중에는 LeetCode를 가장 많이 이용했습니다. LeetCode에는 외국의 빅 테크 기업에서 출제하는 유형의 문제가 많고, 사용자도 상당히 많으며, 사용자들의 참여가 활발하다는 장점이 있습니다. LeetCode를 활용하는 방법은 3, 4단계에서 더 자세히 설명드리도록 할게요. 이외에도 국내외 알고리즘 기출문제 사이트의 특징을 잘 정리해 놓은 포스팅이 있어 공유합니다.



3. 스터디 플랜 세우기

프로그래밍 언어도 정하고 기출문제 플랫폼도 정했으니, 이제 문제를 닥치는 대로 풀면 되겠다고 생각하실 수도 있습니다. 하지만 제 경험상 계획 없이 아무 문제나 푸는 것보다는 스터디 플랜을 세웠을 때 훨씬 효과적으로 공부할 수 있었습니다. 아무리 문제를 많이 푼다고 해도 정작 풀었던 내용이 머리에 남지 않으면 무슨 소용일까요? 효과적인 공부를 위해서는 스터디 플랜을 세우는 것이 좋습니다.


가장 추천드리는 방식은 각 주제별로 몇 개의 문제를 풀고, 그 주제를 완전히 이해하고 나서 다음 주제로 넘어가는 것입니다. 1단계에서 공부했던 자료구조와 알고리즘 개념을 이번에는 문제를 직접 풀어보며 이해해보는 겁니다. 같은 주제의 문제를 여러 개 모아 보면 이 문제들의 패턴이 보입니다. 그리고 처음에는 어렵던 문제도 비슷한 유형을 여러 번 풀다 보면 어떻게 풀어야 할지 감이 잡힙니다. 문제의 패턴을 인식하고, 그 문제를 푸는 방식을 이해하는 게 이 방식의 키포인트입니다. 주제별로 최소 5문제는 풀어봐야 제대로 감을 잡을 수 있습니다. 준비 기간이 짧은 편이라면 비교적 자신 있는 주제는 문제량을 줄이고, 다른 주제에 좀 더 집중하는 방식으로 시간을 절약할 수도 있습니다.


대부분의 기출문제 플랫폼에서는 주제별 문제를 쉽게 찾을 수 있습니다. 예제로 제가 자주 사용한 LeetCode의 경우, Tags 버튼을 클릭하면 여러 주제가 나옵니다. 그중 원하는 주제를 클릭하시면 그 주제에 해당되는 문제가 자동으로 필터링됩니다. 이런 방식으로 주제별 문제를 선별하여 여러 개 풀어보시면 됩니다.

LeetCode에서 주제별 문제 필터링하는 방법




4단계: 결과 분석하기

학창 시절에 모의고사를 보고 나면 오답 노트를 작성했던 것 기억나시나요? 모의고사를 푸는 것도 중요하지만, 틀린 문제가 있다면 왜 틀렸는지 분석하는 게 더 중요합니다. 그래야 실제 시험을 볼 때 같은 문제를 또 틀리지 않으니까요. 비슷한 이유로 알고리즘 문제를 풀고 나면 그 결과를 반드시 분석해야 합니다. 그냥 풀고 나면 끝이라고 생각하고 넘어가기보다는, 결과를 면밀히 분석해보고 어떻게 하면 다음번에 더 잘 풀 수 있을지 고민해봐야 내 것이 됩니다. 그렇게 내 것으로 만들어야 면접에서도 써먹을 수 있습니다. 결국 우리가 이렇게 힘들게 알고리즘 문제를 푸는 목적은 면접에 대비하기 위해서잖아요.


알고리즘 문제의 답을 분석하는 방법은 크게 세 가지가 있습니다.


1. 빅오 표기법으로 시간 및 공간 복잡도 분석하기

모의고사와 다르게 알고리즘 문제에는 한 가지 정답은 없습니다. 코드가 잘 돌아가면 (문제에서 주어진 테스트를 다 통과하면) 그게 하나의 답이 됩니다. 하지만 더 효율적인 답은 있다고 말씀드렸죠. 면접에서는 이 효율적인 답을 찾는 것이 가장 이상적입니다. 자신의 답이 효율적인지 체크하기 위해서는 2단계에 나왔던 빅오 표기법을 이용해 시간 및 공간 복잡도를 분석해 봐야 합니다.


2. 다른 사람의 답과 비교해보기

여러분이 이 문제를 충분히 잘 풀었을 수도 있지만, 더 나은 답이 있지는 않은지 찾아보는 게 좋습니다. 다른 사람이 여러분이 생각지도 못한 방법으로 훨씬 효율적인 코드를 썼을 수도 있잖아요. 그렇다고 해서 ‘나는 왜 이렇게 못 풀었을까’ 하고 좌절할 필요는 없습니다. 이걸 보고 배워서 실제 면접에서 잘 보면 되니까요.


LeetCode에는 문제마다 사용자들이 자신의 답을 올려놓는 Discuss 탭이 있습니다. 여기서 Most Votes 탭을 클릭하면 다른 사용자들의 투표를 가장 많이 받은 게시물이 맨 위에 배치됩니다. 그중 몇 개를 클릭해서 읽어보며 여러분의 답에서 개선할 부분이 있는지 찾아보세요. 그렇다고 이 답을 그대로 베끼면 절대 기억에 남지 않습니다. 이 답은 참고만 하고 자신만의 언어로 직접 코드를 써보는 게 중요합니다.

LeetCode에서 다른 사용자의 답 보는 방법


3. 문제 푸는 데 걸린 시간 재보기

코딩 테스트에는 제한 시간이 있습니다. 그런데 혼자 알고리즘 문제를 풀 때는 시간 상관없이 문제를 푸는 것에만 집중하는 분들이 많습니다. 혼자서 연습할 때 두 시간이 걸려서 푼 문제를 갑자기 면접 때 한 시간 안에 풀 수 있을까요? 면접 시간은 정해져 있고, 아무리 대단한 코드를 쓰더라도 그 시간 안에 다 보여줄 수 없다면 무용지물입니다. 코딩 테스트의 제한 시간에 익숙해지기 위해서는 혼자서 문제를 풀 때도 시간을 재면서 푸는 것이 좋습니다.




여기까지 코딩 테스트 공부법을 4단계로 나누어 보았습니다. 이 방법은 제가 여러 번 시행착오를 겪으며 터득한 공부법입니다. 이걸 잘 활용하신다면 어려운 코딩 테스트에도 충분히 대비가 되실 것이라 확신합니다. 다음 글에서는 라이브 코딩 테스트 실전 편을 공유할 예정입니다. 이렇게 열심히 준비한 면접, 실전에서는 어떻게 해야 최대한의 효과를 낼 수 있을지 궁금하시다면 다음 편을 주목해 주세요!



이전글:


다음글:

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari