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)를 이해해야 합니다. 아직 이게 익숙지 않다면 충분한 연습을 통해 빅오 표기법을 마스터하시기 바랍니다.
참고 자료:
- 빅오 표기법 개념 정리 (엔지니어대한민국 님 영상): https://www.youtube.com/watch?v=6Iq5iMCVsXA
- 빅오 표기법 문제 풀이 (엔지니어대한민국 님 영상): https://www.youtube.com/watch?v=QBZnX_P_dj4
- 각 자료구조 및 알고리즘의 빅오 표기법: https://www.bigocheatsheet.com/
3단계: 알고리즘 문제 풀어보기
기본 자료구조와 자주 쓰이는 알고리즘, 빅오 표기법까지 공부했다면 이제 알고리즘 문제를 풀어볼 차례입니다. 코딩 테스트는 문제만 많이 풀어보면 된다고 생각하시는 분들이 많습니다. 그런데 어느 문제를, 무슨 프로그래밍 언어를 사용해서, 어떤 순서로 풀어야 할까요? 본격적으로 문제를 풀기 전에 아래 세 가지를 정하고 시작하시길 권장드립니다.
1. 프로그래밍 언어 선택하기
면접을 볼 프로그래밍 언어는 본인에게 가장 편하고 익숙한 언어로 선택하시는 게 좋습니다. 우리가 영어를 쓸 때보다 한국어를 쓸 때 더 수월하게 말이 나오듯이, 모국어처럼 편하게 느껴지는 프로그래밍 언어를 사용해야 긴장되는 면접 환경에서도 버벅거리지 않고 코드를 쓸 수 있습니다. 회사마다 사용하는 프로그래밍 언어가 다 다르기는 하지만, 회사에서 지원자가 선택하는 언어로 면접을 보도록 배려해주는 경우가 많습니다. 보통 지원자들이 면접용으로 많이 선택하는 언어로는 Java, Javascript, Python이 있습니다.
2. 알고리즘 기출문제 플랫폼 정하기
국내외 다양한 사이트에서 코딩 테스트에 나올만한 알고리즘 기출문제를 무료로 제공합니다. 이 중에서 자신에게 맞는 플랫폼을 정해서 거기에 나오는 기출문제를 풀어보면 됩니다. 대표적으로 많이 쓰이는 알고리즘 기출문제 플랫폼은 아래와 같습니다.
국내:
해외:
각 기출문제 플랫폼 비교: https://lxxyeon.tistory.com/80
3. 스터디 플랜 세우기
프로그래밍 언어도 정하고 기출문제 플랫폼도 정했으니, 이제 문제를 닥치는 대로 풀면 되겠다고 생각하실 수도 있습니다. 하지만 제 경험상 계획 없이 아무 문제나 푸는 것보다는 스터디 플랜을 세웠을 때 훨씬 효과적으로 공부할 수 있었습니다. 아무리 문제를 많이 푼다고 해도 정작 풀었던 내용이 머리에 남지 않으면 무슨 소용일까요? 효과적인 공부를 위해서는 스터디 플랜을 세우는 것이 좋습니다.
가장 추천드리는 방식은 각 주제별로 몇 개의 문제를 풀고, 그 주제를 완전히 이해하고 나서 다음 주제로 넘어가는 것입니다. 1단계에서 공부했던 자료구조와 알고리즘 개념을 이번에는 문제를 직접 풀어보며 이해해보는 겁니다. 같은 주제의 문제를 여러 개 모아 보면 이 문제들의 패턴이 보입니다. 그리고 처음에는 어렵던 문제도 비슷한 유형을 여러 번 풀다 보면 어떻게 풀어야 할지 감이 잡힙니다. 문제의 패턴을 인식하고, 그 문제를 푸는 방식을 이해하는 게 이 방식의 키포인트입니다. 주제별로 최소 5문제는 풀어봐야 제대로 감을 잡을 수 있습니다. 준비 기간이 짧은 편이라면 비교적 자신 있는 주제는 문제량을 줄이고, 다른 주제에 좀 더 집중하는 방식으로 시간을 절약할 수도 있습니다.
4단계: 결과 분석하기
학창 시절에 모의고사를 보고 나면 오답 노트를 작성했던 것 기억나시나요? 모의고사를 푸는 것도 중요하지만, 틀린 문제가 있다면 왜 틀렸는지 분석하는 게 더 중요합니다. 그래야 실제 시험을 볼 때 같은 문제를 또 틀리지 않으니까요. 비슷한 이유로 알고리즘 문제를 풀고 나면 그 결과를 반드시 분석해야 합니다. 그냥 풀고 나면 끝이라고 생각하고 넘어가기보다는, 결과를 면밀히 분석해 보고 어떻게 하면 다음번에 더 잘 풀 수 있을지 고민해 봐야 내 것이 됩니다. 그렇게 내 것으로 만들어야 면접에서도 써먹을 수 있습니다. 결국 우리가 이렇게 힘들게 알고리즘 문제를 푸는 목적은 면접에 대비하기 위해서잖아요.
알고리즘 문제의 답을 분석하는 방법은 크게 세 가지가 있습니다.
1. 빅오 표기법으로 시간 및 공간 복잡도 분석하기
모의고사와 다르게 알고리즘 문제에는 한 가지 정답은 없습니다. 코드가 잘 돌아가면 (문제에서 주어진 테스트를 다 통과하면) 그게 하나의 답이 됩니다. 하지만 더 효율적인 답은 있다고 말씀드렸죠. 면접에서는 이 효율적인 답을 찾는 것이 가장 이상적입니다. 자신의 답이 효율적인지 체크하기 위해서는 2단계에 나왔던 빅오 표기법을 이용해 시간 및 공간 복잡도를 분석해 봐야 합니다.
2. 다른 사람의 답과 비교해 보기
여러분이 이 문제를 충분히 잘 풀었을 수도 있지만, 더 나은 답이 있지는 않은지 찾아보는 게 좋습니다. 다른 사람이 여러분이 생각지도 못한 방법으로 훨씬 효율적인 코드를 썼을 수도 있잖아요. 그렇다고 해서 ‘나는 왜 이렇게 못 풀었을까’ 하고 좌절할 필요는 없습니다. 이걸 보고 배워서 실제 면접에서 잘 보면 되니까요. 대부분의 기출문제 플랫폼에서는 다른 사용자의 답안을 공개하며, 가장 많은 추천을 받은 답안을 상위에 배치합니다. 이 기능을 활용해서 다른 좋은 답안이 있는지 찾아보고 참고하세요.
3. 문제 푸는 데 걸린 시간 재보기
코딩 테스트에는 제한 시간이 있습니다. 그런데 혼자 알고리즘 문제를 풀 때는 시간 상관없이 문제를 푸는 것에만 집중하는 분들이 많습니다. 혼자서 연습할 때 두 시간이 걸려서 푼 문제를 갑자기 면접 때 한 시간 안에 풀 수 있을까요? 면접 시간은 정해져 있고, 아무리 대단한 코드를 쓰더라도 그 시간 안에 다 보여줄 수 없다면 무용지물입니다. 코딩 테스트의 제한 시간에 익숙해지기 위해서는 혼자서 문제를 풀 때도 시간을 재면서 푸는 것이 좋습니다.
https://www.wanted.co.kr/events/22_11_s01_b15?utm_source=wanted&utm_medium=share
'알고리즘문제풀이' 카테고리의 다른 글
[알고리즘/Python] 재귀함수와 팩토리얼 (0) | 2023.02.23 |
---|---|
[알고리즘/Python] BFS(너비우선탐색) (0) | 2023.01.18 |
[알고리즘/Python] 깊이우선탐색 (DFS) (0) | 2023.01.18 |
[알고리즘/Python] 그래프(Graph) (인접행렬,인접리스트) (0) | 2023.01.18 |
[알고리즘/Python] 에라토스테네스의 체 (0) | 2023.01.18 |
댓글