Search
Duplicate
📭

코딩테스트에 대한 작은 견해

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
알고리즘
태그
알고리즘
Scrap
8 more properties
저 역시 비전공자 출신으로, 2년전 sw에 입문하여 계속 학습해 나가고 있습니다. 클러스터에 있다 보면, 크고 작은 채용들이 이어지면서 첫 관문인 코딩테스트에 대해 이야기가 오가는 것을 듣게 됩니다. 그리고 그 속에는 여러가지 걱정 근심이 담겨 있곤합니다.

코딩테스트의 역할은?

코딩테스트의 역할은 지원자를 필터링하는것입니다. 채용에 절대적인 역할을 하는 것은 아닙니다. 더욱이 최근에는 코딩테스트 결과와 서류를 함께 보는 경우도 많습니다. 코딩테스트의 역할에 대해 생각해 봐야하는 이유는, 그 역할에 맞게 코딩테스트에는 의도가 담기게 되고, 그 의도는 코딩테스트의 난이도로 나타나게 됩니다.

확인하고자 하는것은 문제해결 능력

코딩테스트의 역할은 지원자를 필터링하는 것이라 하였는데, 그 기준이 바로 문제해결 능력입니다. 그래서 특정 알고리즘을 사용하는 문제는 잘 나오지 않습니다. 보통 특정 알고리즘은 활용가능한 조건이 존재하고, 그것이 문제의 모양새를 결정하게 됩니다. 해당 유형의 문제를 접해본 이들에게는 쉽고, 그렇지 않은 이들에게는 어렵기 때문에, 코딩테스트의 역할에 맞는 문제가 되지 못합니다. 그래서 코딩테스트에는 적당한 자료구조를 선택하여 조건문과 반복문을 통해 구현하는 문제들로 이루어지게 됩니다.

코딩테스트를 준비하는 방법

코딩테스트를 준비하는 가장 확실한 방법은 많은 문제를 풀어보는것 입니다. 코딩테스트는 결국 어느정도 정해진 문제의 유형안에서 출제되는 만큼, 해당 유형의 문제를 접해본 유무가 중요합니다.
백준사이트를 만든 백준의 특강에서는 처음 본 유형의 문제를 푸는데 너무 많은 시간을 소요하지 말라고 권합니다. 처음 본 유형의 문제는 적당한 시간(30분)정도 고민 후 정답을 확인하여 문제를 푸는 방법을 익히고,
계속해서 더 많은 문제를 풀어가는것을 추천했습니다.
저는 이러한 관점에서 품질 좋은 문제를 접하기 위한 효과적인 방법으로 코딩테스트에 적극적으로 참여하는 것을 추천합니다. 많은 회사들에서 코딩테스트를 도입하고 있고, 여기에 활용될 문제 하나를 만드는데 상당한 시간과 비용이 드는것으로 알고 있습니다. 우리가 모의고사를 통해 수능을 준비하였듯이, 여러 코딩테스트에 참여하여 실전과 같은 경험을 쌓아가시길 추천합니다.

42에서는...?

42과정과 취업사이에서 어디에 포커스를 둘 것인지 고민하는 이야기를 듣기도 했습니다. 취업이 다급하다면 취업에 포커스를 맞추는것에 무어라 할 순 없지만, 42과정 속에서 문제해결 능력향상시킬 수 있다고 봅니다.
코딩테스트에서도 결국 주어진 문제를 어떻게 풀어나갈 것인지 설계해고 해결하는 과정을 거칩니다. 42의 CS와 관련된 과제를 해결해 나가는 과정에서 CS 배경 지식을 학습하고, 코드를 설계하여 해결하는 과정을 거칩니다.
글을 작성하는 시점에서, Libft & GNL & Printf & B2B & PIPEX를 완료했고, PUSH_SWAP을 진행중에 있습니다. 저는 해당 과제들을 수행하며, 저런 과제들을 해결한 경험이 있는데, 왜 코딩테스트를 걱정하는지 사실 의문입니다. 42과정을 충실히 해냈다면, 코딩테스트 문제들을 접하는 경험을 쌓은 이후에는 충분히 코딩테스트를 통과할 수 있다고 봅니다.

알고리즘 살짝...

적은 빈도이긴 하지만, 특정 알고리즘을 알고 있을때 큰 도움이 되는 경우도 있습니다. 알고리즘을 아는 것이 어떻게 실질적으로 도움이 될까요?
상대적으로 가장 긴 시간의 코딩테스트를 진행하는 카카오에서는 5번 문제쯤 tree가 등장하고, 6번에서 특정 알고리즘을 사용해야 접근이 쉬운 문제가 나옵니다. (이번 6번 문제는 2차원 누적합 이였습니다. & 7번 문제까지 분석할 일은 없어서...) 2년전 접한 삼성의 기출문제인 다리만들기2는 다익스트라 알고리즘을 적용하면 쉽게 풀 수 있는 문제 였습니다.
저는 알고리즘은 매우 효과적인 문제해결 도구라고 생각합니다. 우리가 문제 해결을 위해 작성하는 코드는 완전해야합니다. 완전하지 않아 테스트를 돌렸을때 실패하는 것을 많이들 경험하셨을 것입니다. 우선 알고리즘은 수학적으로 검증되었습니다. 그래서 그 알고리즘을 의심할 필요 없이, 알고리즘을 적절한 곳에 적용하기만 하면 됩니다.
알고리즘을 적절한 곳에 적용했을때의 예시로 다리만들기2를 살펴봅시다.

다리만들기2

다리만들기2를 풀기 위해 공통적으로 필요한 단계는 다음과 같습니다.
섬을 구한다.
섬간의 최소길이 다리를 구한다.
다익스트라 알고리즘을 알기 전, 이 문제를 풀기위해 적용했던 방식은 다음과 같습니다.
모든 최소길이 다리(N개)를 가지고, 1 ~ N개의 다리를 선택하는 조합을 구한다.
조합의 각 경우의 수로 모든 섬을 건널 수 있는지 체크한다.
모든 섬을 건널 수 있다면, 다리길이의 합과 최소비용을 비교해 업데이트한다.
하지만 다익스트라 알고리즘을 안다면 다음 1번의 단계로 해결할 수있습니다.
다익스트라 알고리즘을 적용한다.
다리만들기2 코드 (without 다익스트라)

마무리

이전부터 생각한 주제이긴 한데, 급박하게 작성한 감이 있습니다. 결론적으로 말씀드리고 싶었던 것은 코딩테스트를 통해서 요구하는 것은 문제해결 능력이고, 저는 여러분들이 참여중인 42과정에서도 충분히 문제해결능력을 쌓을 수 있다고 말씀드리고 싶었습니다.
그리고 코딩테스트 언어를 고민하는 이야기도 들었었는데, 편하신것을 사용하시면 됩니다. C만 다뤄봐서 C or C++을 선택하여도 되고, 코딩테스트에서 도움이 될 수있는 여러 인터페이스를 지닌 Python을 사용해보는것도 좋습니다.
하지만 결국 핵심은 문제해결 능력입니다. 장인은 도구를 탓하지 않습니다(?). 문제를 풀이할 실력이 충분하다면, 언어의 선택은 부수적인 것에 불과하다고 봅니다.
올바른 노력을 꾸준히 한다면, 분명 보답이 있을 것이라 생각합니다. 42에서 얘기하는 적정 학습시간은 주 60시간입니다. 42서울에서는 그렇게 까진 아니더라도 주 40시간 학습이 필요하다고 이야기합니다. 심지어 이것들은 42과정에만 집중했을 때의 이야기 입니다. 취업등을 병행한다면 더 많은 시간이 필요하겠죠. 매일 올바른 노력을 꾸준히 쌓아가시길 기원합니다.