diff --git a/_posts/2023-01-25-coding-test.md b/_posts/2023-01-25-coding-test.md new file mode 100644 index 0000000..fb9eab9 --- /dev/null +++ b/_posts/2023-01-25-coding-test.md @@ -0,0 +1,147 @@ +--- +layout: post +title: 주저하는 개발자들을 위해 - 코딩 테스트 +author: 고병룡 +categories: 기술세미나 +banner: + image: https://www.hanbit.co.kr/data/editor/20200918163925_xyypndmo.png + background: "#000" + height: "100vh" + min_height: "38vh" + heading_style: "font-size: 4.25em; font-weight: bold; text-decoration: underline" + tags: [코딩테스트, 기술세미나] +--- + +## 코딩 테스트? +코딩 테스트란 개발자의 기술적인 역량을 시험하기 위해 실시하는 알고리즘이나 구현을 요구하는 테스트다. + +회사 입장에서는 지원자를 평가하는 최소한의 기준이고 지원자에게는 ~~통곡의 벽~~ 처럼 느껴지는 코딩 테스트 대체 왜 해야할까? + +그리고 또 어떻게 준비해야만 할까..? + +## 코딩 테스트 그래서 왜 해야하나? +무엇보다도, 많은 회사들이 코딩테스트를 1차적인 관문으로 두고 지원자를 거르고 있기 때문에 그런 회사들에 지원할 생각이 있다면 꾸준히 준비하는 게 좋다. + +> 아래 4가지 이유를 통해서 조금 더 자세히 알아보자면.. + +* 여러분들이 가고 싶어하는 많은 회사에는 정말 많은 지원자가 몰린다. 이들 개개인의 모든 역량을 테스트하기에는 현실적으로 무리가 있고, 이 과정에서 코딩 테스트는 효율적으로 이들을 가려내는데 도움이 되기 때문에 많은 기업들이 도입한다. +* 여러분들이 어떤 식으로 코드를 작성하는지 미리 확인하고 어떤 사고 방식과 결론, 평소 개발을 어떻게 하는지 엿볼 수 있는 창구와 비슷하다. 자신이 어떤 개발자인지 비교적 손 쉽게 다른 개발자들에게 보여줄 수 있다. +* 개발에 필요한 지식들을 보여주고 나의 컴퓨터 과학 지식을 기반으로 한 나의 문제 해결력을 보여주기 쉽다. 결국 알고리즘 문제를 구현한다는 건 그 문제를 이해해야만 할 수 있는 거고, 그에 맞는 알고리즘을 찾고 시간 내에 테스트 케이스들을 통과시켜야 하기 때문에, 비교적 쉽게 내 문제 해결 능력을 보여줄 수 있다. +* 개발자는 자주,, 생각보다 자주 이직이라는 카드를 꺼내든다.. 이직할 때 코테 준비를 하지말고,, 항상 이직이라는 카드를 꺼낼 수 있도록 언제든 코테를 준비를 할 필요가 있다. + +## [당신이 코딩테스트를 포기하는 7가지 이유](https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85-%ED%86%B5%ED%95%A9%ED%8E%B8) +아래의 7가지 이유는 [한정수님](https://github.com/Integerous)의 [비전공자를 위한 개발자 취업 가이드](https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B7%A8%EC%97%85-%ED%86%B5%ED%95%A9%ED%8E%B8)의 내용에서 가져온 개발자들이 코테를 포기하는 7가지 이유이다. + +가져온 이유들에는 각각 논리적인 허점이 존재하고 우리는 같이 그것을 깨부수고 코딩테스트를 준비하기 위한 마음가짐을 잡아 보도록 하자. + +>1. 코딩 테스트를 보는 회사에는 어차피 서류 합격도 못할 것이다. + +아니다. 서류만 내도 코테를 보게 해주는 회사가 많고 “서류”도 영향이 있지만 “테스트 결과” 도 영향이 있다. +> 2. 코딩 테스트를 준비할 시간이 없다. + +분명히 당신의 하루에는 낭비되는 시간이 있다. 그 시간을 찾아서 하자. 코딩 테스트 준비 뿐만아니라 다른 공부도 마찬가지다.. +> 3. 지금부터 준비하더라도, 더 오래 준비한 전공자들에게 밀릴 것이다. + +체육 전공한 사람이 마라톤을 더 잘 뛸까? 아니면 일반인이 더 잘 뛸까? 확률은 전자가 높겠지만 거의 비슷하게 힘들다. 전공자들이라고 해서 코테가 쉽고 뚝딱 풀리는 일은 아니다. +> 4. Java(언어), Spring(프레임워크)도 제대로 못하는데 무슨 코딩 테스트? + +코딩 테스트라도 제대로 해야지 면접은 볼 수 있지 않을까? 물론 둘 다 잘하면 정말 좋고 그것도 아니라면 면접에 들어갈 수 있는 실력이 된다는 것 자체로도 의미가 있다고 생각한다. 코테를 볼 기회는 항상 찾아오는게 아니니... +> 5. 코딩 테스트 안봐도 개발로 취업은 하더라. + +당연히 할 수 있다. 하지 않는 기업을 찾아서 지원하면 된다. 하지만 차라리 코테를 준비하고 더 많은 기회를 얻는게 맞지 않나 라는 생각이 든다. +>6. 조금 해봤는데, 너무 어렵다. + +착각하는 분들이 있는데 우리는 대회를 나가자고 하는 게 아니다. 코테를 쳐보는 것만으로도 소중한 자산이다. 이걸로 상을 타는 게 아니라 우리는 취업이 목적이기에.... +>7. 어떻게 준비해야 될지 모르겠다. + +그러면 이제부터 알아보자! 만약 필자가 뭐하는 사람인지 의심이 간다면.. 그래도 나름 [열심히(?)](https://solved.ac/profile/hodako97) 준비해오고 [알고리즘을 좋아하고](https://github.com/fingersdanny/PS_note), [알고리즘 스터디](https://github.com/Kernel360-cell1/algorithm-study)를 운영 중인 사람 중 하나로써 여러분들이 코테에서 더 행복해지길 바라는 마음에서 준비했다. + +## 코딩테스트 어떻게 준비해야 할까? + +### 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) + +> 알고리즘과 마찬가지로 위에 있는 내용들도 전부는 아니지만 말로 설명할 수 있어야 한다. + +> 알고리즘 공부를 시작하고 싶은데 어디서부터 보는게 좋을까요? + +개인적으로 방법은 중요하다고 생각하지 않고 꾸준히 보는게 더 낫다고 생각하지만 그래도 몇 가지 강의 및 책을 추천해보자면, + +[이것이 코딩 테스트다](https://product.kyobobook.co.kr/detail/S000001810273?utm_source=google&utm_medium=cpc&utm_campaign=googleSearch&gad_source=1&gclid=EAIaIQobChMIutbEu_OphAMVE1cPAh1V2A1hEAAYASAAEgLDevD_BwE) + +[BaaaaaaaarkingDog님의 실전 알고리즘 강좌](https://blog.encrypted.gg/919) + + +### 2. 꾸준히 풀자 + +너무나도 당연한 말이지만 생각보다 코딩 테스트는 언제든 볼 수 있게끔 준비를 해놓는 상태가 훨씬 좋다고 생각한다. 꾸준히 준비하지 않으면 실력이 떨어지는 속도는 가파르지만 실력을 올리는 속도는 생각보다 더 걸릴 수 있다. + +따라서 사람들이 자주 사용하고, 실제 코딩 테스트 환경에 가까운 곳에서 자주 문제를 풀어보기를 권장한다. + +* [프로그래머스](https://school.programmers.co.kr/learn/challenges?order=recent) : 많은 기업들의 코딩 테스트를 진행해주고 있고 문제도 꾸준히 올라온다. 카카오 등의 기업 공채에서의 기출 문제 또한 제공하고 있다. +* [SW Expert Academy](https://swexpertacademy.com/main/main.do) : 삼성에서 운영하는 코딩테스트 및 알고리즘 학습 사이트이다. 삼성 관련 (반기 마다 열리는 알고리즘 특강, 입사 시 코딩 테스트)가 모두 여기에서 요구하는 문제 입출력 방식이나 라이브러리를 어떤 것을 사용할 수 있는지 까지 미리 알고 준비할 수 있다. +* [Baekjoon Online Judge](https://www.acmicpc.net/) : 다양한 문제를 제공하고 삼성 SW 역랑 기출 문제를 제공하고 있다. 압도적인 문제 수와 유저 수로 인해 문제를 풀지 못했을 때 물어볼 곳이 더 많다는 이점이 있다. + +개인적으로는 백준을 제일 좋아하고 애용한다. 꾸준히 풀기를 지키기 위해서는 나름의 보상이 필요하다고 생각하는데.. 필자는 꾸준히 풀기 위해 코딩 테스트를 나름의 게임이라고 생각하여 위 백준 사이트와 연동되는 [solved.ac](https://solved.ac/)를 활용하여 꾸준히 잔디 심기(?) 및 랭크를 통해서 코딩 테스트를 준비중이다. + +### 3. 실제로 구현하기 전에 어떻게 구현할 지 손으로 적어보자 + +아는 문제가 나와서 구현부터 할 생각할지 말고 무엇부터 어떻게 구현할지 생각해보고 문제 풀이를 작성해보자. + + 1. 요즘 코딩 테스트에 나오는 문제들은 설명이 길다. 미리 순서를 정해두지 않고 구현만 하다가 보면 중간에 갈 길을 잃기 쉽고 문제 설명 중 어디까지 구현했는지 추적할 수가 없다. 결국 다시 되돌아가서 문제를 읽어야 할 수 도 있다. 처음부터 모든 상황을 본인의 언어로 정리해둔다면, 헷갈릴 이유도 없고 본인이 어디까지 구현했는 지 추적이 가능하다. + 2. 대부분의 코딩 테스트는 펜과 종이를 허용한다. 이걸 준비하라고 하는 이유는 써서 고민해봐도 좋다는 얘기고 이것을 활용하지 않을 이유가 없다! + 3. 많은 수의 기업이 코딩 테스트에 대한 기출문제를 제공하지 않는다. 따라서 직접 적어 놓은 문제 구현 계획을 보고 나서 나중에 복기할 수 있도록 한다. + +### 4. 시간 분배를 잘하자. + +1. 문제를 풀기 전에 시간 복잡도 계산을 해보고 올바른 알고리즘을 골랐는지 생각해보자. 보수적으로 생각했을 때 연산이 1억번을 1초라 가정하면 대부분의 문제에서 시간 초과를 받지 않을 수 있다. 어떤 알고리즘을 사용할지 입력의 최대 범위는 어디까지인지 시간은 얼마나 주어졌는지를 복합적으로 고려해보고 문제를 풀어야 한다. +2. 실제 시험도 마찬가지지만 문제 당 시간 분배가 중요하다. 최악의 경우 2시간 내에 4문제를 풀어야할 수도 있고 그거 보다 길거나 짧을 수 있다. 평균적으로 실전에서는 40분 ~ 1시간이 주어진다고 생각하고 문제를 접근해야 테스트 중 시간이 모잘라서 문제를 포기하는 불상사를 겪지 않을 수 있다. +3. 여느 시험을 볼 때와 마찬가지로 너무 오래 걸리는 문제만 붙잡고 있지 말아야 한다. 모든 답안을 다 들고 시험장에 갈 수 없듯이 코딩테스트도 못 푸는 문제가 있을 수 있다. 그럴 땐 넘기고 시간이 남을 때 돌아보는게 정신건강에 훨씬 더 좋다. +4. 앞의 내용의 연장선에서 대부분의 코딩테스트는 순서대로 풀지 않아도 된다. 처음에 문제를 받는다면 쭉 훑어보고 해당 문제의 알고리즘이 바로 보이거나 구현이 오래 걸리지 않을 것 같은 문제들을 빨리 풀고 시간을 아끼는 게 좋다! + + +## 참고 자료 +이것이 코딩 테스트다, 나동빈 저, pg 46 - 50 + +[개발자 취업을 위한 코딩 테스트 준비 방법](https://katfun.tistory.com/192) + +[알고리즘 분류 참고 - 백준 온라인 저지 알고리즘 별 문제 분류](https://www.acmicpc.net/problem/tags) +