private/memo

취업을 위한 알고리즘 공부법.

qkqhxla1 2019. 1. 10. 11:01

자소서 : http://qkqhxla1.tistory.com/797
면접 후기 : http://qkqhxla1.tistory.com/799
내가 한 공부들과 방법 : http://qkqhxla1.tistory.com/802
취업을 위한 알고리즘 공부법 : http://qkqhxla1.tistory.com/990

데이터 엔지니어 경력 5년 이직준비 후기 : https://qkqhxla1.tistory.com/1193

 

아래에 적을건 취업용 알고리즘 공부 방법입니다.
제가 2년 반 전(2016년 6월쯤)에 공부했던 방법이니까 현재도 유용할거에요. 굳이 취업용이라고 적은건 대회에 나갈 정도까지 심화해서 공부해본적이 없었기 때문에 취업용이라고 적었어요. 그리고 이 글을 보는 사람들 대부분이 취업용으로 알고리즘 공부법을 찾아서 오는 사람들이기에, 그런 사람들을 대상으로 적겠습니다. 알고리즘 사이트는 제가 공부한 백준을 기본으로 말씀드립니다.

백준은 제가 풀었을때 기준 1페이지(100위) 안까지는 들었었습니다.(예전에 한 인증 남겨두길 잘했다.)

아래처럼 공부해서 네xx하고 쿠팡 + 스타트업, 일부 중견기업 알고리즘 시험봐서 대부분 풀었었어요. 네xx에서 나왔던 알고리즘 문제는 전부 이미 한번씩 풀어본 문제였습니다. 카카오는 저때 공채가 없었는데 이후에 공채 문제 풀어봤는데 풀만 했었습니다.

 

필요한 것 : 긴 시간동안 공부할 끈기와 시간. 길면 길수록 좋습니다. 전 아래에 적은 단계중 3단계 정도에서 시작한것 같은데 5개월 공부하니 많이 넉넉했습니다.(아 이정도면 이제 충분하다고 본인이 느낄 정도?) 전 5개월 했지만 3~4개월만 하시면 충분할겁니다.

5개월동안 정리한 자료는 여기 있습니다. 

이론 : http://qkqhxla1.tistory.com/category/algorithm/theory

문제 : https://qkqhxla1.tistory.com/category/algorithm/problem%20solving

전 5개월 했는데 지금와서 보자니 이 5개월이 전부 필요했다기보다 알고리즘 공부를 위해 뇌를 말랑말랑하기 만들기, 코테에 안나오는데 안나오는지 모르니까 필요없는 부분도 굳이 공부한거, 공부하는 방법 찾는데 소요된 시간도 많습니다. 지금 다시 신입공채를 백지상태에서 유형이 어떻다만 안 상태에서 공부하면 3개월이면 될것 같습니다.

 

2016년 6월에 4학년 2학기째였고, 수업이 많이 없어 알고리즘만 공부했습니다. 혹시나 다른 스펙을 미리 만들어놓으신 분이라면 4학년 1학기 방학 시작하고 나서 졸업할때까지 알고리즘만 집중적으로 빡세게 하시면 될겁니다. (사기업 기준 컴공은 높은 영어점수 얻는거보다 알고리즘 잘하는게 취업 더 잘됩니다. 학벌이 별로 안 좋을 경우 마지막 엎어치기도 되고요.) 

시기상으로도 좋아요.

 

 

 

1. 기초적인 프로그래밍 공부.
대상자 : 전공 학부생인데 공부 안함. 그냥 친구따라 놀았음. 학부 성적도 기냥저냥, 또는 비전공자인데 이제 흥미를 갖기 시작함.

 

첫번째로 언어에 대한 기본서 한권정도 읽으셔서,(어떤 프로그래밍 언어를 선택할지는 본인 선택이고 주제와 조금 벗어나기때문에 적지 않겠습니다. ) 기본적인 프로그래밍 틀을 잡습니다. 그리고 기본적인 문제들을 많이 풀어봅니다. 기초적인 프로그래밍 100제. 등의 문제지를 빌려서 본인의 언어로 구현해봐도 되고요.

개인적으로 대학교 1,2학년이시거나 시간이 많이 있으시면 네이버 지식인 서비스에서 답변자로 활동하는걸 추천드립니다. 시간이 없으면 하지 말고요. 이유는 여기에 적어놨었어요.. 1번 단계에서는 생각을 프로그래밍으로 옮기는 아주 기초적인 단계에 대부분 문제들이 집중되어 있습니다. 언어의 가장 기본적인 함수들에 익숙해지고, c언어는 문자열 끝에 \0이 붙네? 등. 프로그래밍 감각을 키우는 단계죠. 문자열을 거꾸로 출력하려면 어떻게 해야 할까?정도의 기본적인 논리력을 기르는 단계입니다. 더불어 ide사용에 익숙해지고 c라면 특정 함수를 사용하기 위해 어떤 헤더파일을 include해야 하는지 등등의 아주 기초적인 개념을 잡습니다.

 

 

 

2. 기본적인 프로그래밍, 자료구조, 기초 알고리즘 공부.

대상자 : 1번에 언급된 정도는 어느정도 했다. 이제 기본적인 프로그래밍 베이스를 쌓고 싶다, 전공자인데 학부생(4년제 기준 2학년) 수준에서 나오는 문제를 복습해보고싶다.

 

1번단계는 넘어가도 되겠다.. 하시는 분들입니다. 적당한 자료구조 책 한권 사서 정독하시고, 본인의 언어로 어느정도 개념을 알때까지 구현하세요. 그리고 알고리즘 책도 사서 정독하시고 한번 훑습니다. 여기서 말하는 알고리즘 책은 대학교때 자료구조책과 같이 쓰는. 그런 알고리즘 기본서나 정석 같은 그런 책입니다. 알고리즘 읽다 보면 가장 인기있는부분이 정렬인데, 한번 정리해두고 시간복잡도나 이런건 면접 전에 한번씩만 보면 됩니다. 요즘 알고리즘 시험에는 정렬이 잘 안나와요. 면접때 나올수 있으니 그전에만 한번더 훑고 가세요.

한번더 적자면 알고리즘 책은 밑에 적은 '알고리즘 문제 해결 전략' 책처럼 알고리즘 대회 준비용 책과 대학교에서 알고리즘 가르치기용으로 나온 책이 따로 있습니다. 이중에 대학교에서 가르칠만한 그런 정석 개념의 책으로 하시라는겁니다.(뭔소린지 모르시겠으면 직접 서점가서 한번씩 읽어보시는걸 추천드리고 가장 기초적으로 보이는 책을 삽니다.) 알고리즘 대회 준비용 책은 이 단계에서 보기에 너무너무 어렵습니다.

그리고 시간복잡도와 공간복잡도에 대해 잘 알아둡니다. 특히 시간복잡도의 경우에는 대부분 면접에서 손코딩할 경우에 물어봅니다. 이 코드는 시간복잡도가 어떻게 될까요? O(n^2)의 복잡도인데 복잡도가 너무 큰데 좀 줄이는 방법은 없을까요? 등으로 물어보므로 앞으로 알고리즘 문제를 풀면서 시간복잡도와 공간복잡도를 한번씩 계산해보는게 좋습니다.

일반적으로 자주 사용하는것들중 몇개를 적으면 반복문이 한번이면 O(n), 중첩 반복문이면 O(n^2), 이분 탐색의 시간복잡도는 O(logn), 언어에 있는 정렬을 사용하면 O(nlogn) 등입니다.

이제 이정도 했으면 백준사이트 입문할 준비가 되었습니다. 백준의 UI도 익숙해질겸 https://www.acmicpc.net/step 에 있는 기본적인 문제들을 풀어보면서 백준 사용법을 익힙니다. 

처음 들어보는 개념들의 문제(동적 계획법, 백트래킹, 네트워크 플로우 등)와 어려보이는것들은 풀지 마세요. 기본적인 큐 사용하기. 문자열 사용하기. 이런 들어본 것, 공부해본 것, 정답비율 높은것들만(최소 50-60%이상) 좀 풀어보세요. 이정도 난이도부터가 피보나치 수열을 재귀함수로 구현하기 시작하는 정도입니다. (피보나치는 재귀로 짜면 큰 수를 구할수 없지만 처음에는 다 재귀로 배웁니다.) 

큐 사용하기. 이런 종류의 문제는 자료구조 구현보다도 공부했던 자료구조 복습과 내가 몰랐던 언어 내의 라이브러리를 검색함으로서, 기본적인 검색 능력도 길러지게 됩니다. 구글 검색능력도 아주 중요한 실력의 하나입니다.

 

 

 

3. 기본기 응용, 알고리즘 공부 시작.
대상자 : 열심히 학교수업따라와서 기본 탄탄한 학부 3,4학년생, 학부생 수준보다 더 높은 수준의 공부를 시작하려는 사람, 코딩테스트용 알고리즘 입문할 정도가 되는 사람. 취준 준비 시작하는 사람.

 

1,2단계는 다 넘어왔다고 가정합니다. 기본적인 자료구조, 알고리즘을 구현할수 있으며, 필요에 따라 살짝 바꿔서 쓸수 있습니다. 대부분 2,3단계부터가 면접에서 손코딩으로 구현해야하는정도의 난이도고, 3단계 정도부터가 일반적인 기업에서하는 온라인 알고리즘 '테스트' 난이도입니다. 

백준에 들어가서 문제집 카테고리 -> 공개 카테고리로 간 후 끝 페이지로 갑니다. 그리고 하나하나 돌아가면서 쉬워보이는 카테고리를 골라서 들어가서 푸세요.(여전히 어려운건 풀지 마세요!) 

쉬운 문제들이라서 2번 단계와 중복될수 있지만, 중간중간에 수학 지식이 섞여있는게 있어서 단순한 구현의 문제인 2번보다는 생각을 더 해야 합니다. 예시 : https://www.acmicpc.net/problem/1085

3단계는, 2단계까지의 기본 알고리즘이나 자료구조등을 활용한 문제,(구현이 아니라 활용한 문제) 프로그래밍 + 수학지식이 섞인 그런 초중간단계의 난이도입니다. 이 단계부터 슬슬 단순히 머리로 생각한것을 프로그래밍으로 별생각없이 옮기는게 아닌 추가적으로 더 생각을 해야 합니다.(예로 1~n까지의 합. 이라고 하면 단순히 반복문을 돌려가며 다 더하는게 아닌 n(n+1)/2라는 공식을 써서 효율적으로 만드는 정도, 탐색을 위해서 무조건 전부 다 돌아가며 탐색하기보다는 정렬이 되어있는 경우 이분탐색, 더 나아가서는 메모리에 큰 제한이 없으면 사용할만한 hashmap자료구조가 빠르다는것을 알고 활용하기 시작하는 정도, 피보나치 수열을 반복문으로 구현하며 기존 계산값을 저장해놓음으로써 메모이제이션에 대한 개념을 잡기 시작하는 정도.) 

이정도 난이도부터가 프로그램을 효율적으로 돌게 하기위한 로직을 조금씩 생각하기 시작하는 진정한 알고리즘 공부 입문입니다. 2단계까지가 기본 지식을 쌓는 단계면, 3단계부터는 알고리즘이 이런거니 마음의 준비를 좀 해라? 하는 단계입니다.

 

 

 

4. 취업대비 알고리즘 공부 시작. 
대상자 : 코딩테스트용 알고리즘 중급 난이도 시작자. 자료구조 적당히 구현 다 할줄 알고, 기본적인 함수들과 다른 자료구조 지식들을 섞어서 프로그램을 자유롭게 만들수 있는 정도. 시간복잡도로 효율성 알며 어떤 경우에 어떤 자료구조를 써야하는지 아는 정도. 중,대기업 노리고 코딩테스트 공부 익숙해지려는 사람.

여기서부터 난이도가 대폭 올라갑니다. 난이도를 1~10으로 잡으면 3단계까지는 2,3? 정도면 4단계부터는 7,8정도로 올라갑니다. 중견기업 이상 준비하시는 분이면 이 난이도까지는 오는게 좋고, 이 단계도 빡세게 할만하다 싶으시면 상위 it 기업(네이버 카카오등)도 가능합니다.

취업용 알고리즘 책을 삽니다. 전 종만북이라고 불리는 알고리즘 문제 해결 전략 책을 샀습니다. 종만북을 읽으면서.. 챕터 1 읽고, 가볍게 구현해보고, 예로 읽다가 챕터 7이 분할 정복이다. 챕터 7을 읽고, 방법론 등을 이해하고 구현 후 백준 사이트에 가서 알고리즘 분류 카테고리로 갑니다. 그리고 분할 정복 카테고리를 찾아서 들어갑니다. 그리고 풀수 있는 만큼 풉니다. 못 풀겠으면 구글이나 네이버 등에 검색해서 답을 찾아보고 이해합니다.

알고리즘 공부시 본인이 깊게 오랫동안 생각해보는것도 중요하지만 초중반에는 코딩자체를 어떻게 해야 할지 모르는 경우가 많으므로 문제와 답을 보고 이해하면서 머리속으로 해당 문제의 템플릿을 만들어놓는게 좋습니다. 다만 어느정도가 지나면 이 알고리즘에 대해 스스로 코드를 짤 줄 알아야 합니다.(스스로 못짜면 공부한게 아니겠죠.) 특정 알고리즘에 대해 문제가 많다 싶으면 적당히 하고 괜찮다 싶으면 다음으로 넘어가도 됩니다.

이런 식으로 모든 분류를 한바퀴 순회합니다. 종만북에 없는 알고리즘은 네이버나 구글에서 이론을 찾아서 한번씩 읽어보고 풀어보는게 좋습니다만.. 시간이 많이 부족하면 비주류 알고리즘은 안 푸는게 효율적으로 좋습니다. 당연한 얘기지만 종만북에 모든 알고리즘이 나오는게 아니며, 종만북에서 안 나온 알고리즘이 코딩테스트에 나올 수도 있습니다. 종만북 공부는 알고리즘 공부를 하기 위한 틀을 잡아준다고 생각하세요. 틀 안을 채워넣는건 본인이 할 일이구요.

 

문제 풀다 보면 어떤게 주류이고, 비주류인지 알수 있습니다. 예로 주류는 트리, 구현, 다이나믹 프로그래밍, bfs dfs, 백트래킹과 같은 탐색 등이고 비 주류는 suffix automaton, 아호코라식같은 이름부터가 요상한 알고리즘, 수학과 관련된것들 등등입니다. 알고리즘 대회를 준비하는게 아니라 취업용이기 때문에 대부분 문제가 많은 주류 알고리즘을 많이 풀어보는게 좋습니다. 

'주류'라고 제가 언급한 코딩테스트에서 주로 나오는 유형을 알려면 최근 n년이내의 코테를 찾아보면서 미리 유형을 익혀두는게 좋아요. 카카오같은곳은 공개되어있고, 비공개인 다른곳은 지인 찬스나 구글링해가면서 어떻게든 찾아보구요.(정보 찾기 힘드시면 저처럼 다 공부하시면 됩니다..) 효율적인 공부와 시간낭비를 최소로 하고 싶으시면 계속해서 유형을 파악해두는게 정말 중요합니다.

카테고리도 진짜 코테에 절대 안 나오는 카테고리가 있고, 예전에 좀 나왔다가 요즘엔 안나오는 애매한 카테고리가 있는데 절대 안 나오는 카테고리만 거르고 애매한것까지 다 공부하는게 시간은 좀 걸리겠지만 가장 좋은 방법이긴 합니다.

 

특히 구현 종류와 다이나믹 프로그래밍(통칭 DP)을 많이 풀어보는게 좋다고 개인적으로 생각합니다. 코테에서 주로 나오는 알고리즘들 대부분은 몇 문제만 풀면 개념적으로 이해하기 쉬운데,(특히 bfs dfs같은건 한번 이해하면 활용하기도 왠만해서 쉬움) dp의 경우 같은 dp라도 종류가 너무 많아서 많이 풀어보는게 좋다고 생각합니다.(다이나믹 프로그래밍이라는 큰 틀 안에도 또다른 이름의 알고리즘이 많이 있음.) 그리고 구현은 백준만 보시면 난이도가 낮다고 생각하시는 경우가 좀 있는데 어느정도 어렵게 나오는 구현 문제가 정말 종합적인 코딩능력을 길러줍니다. 코테에도 꾸준히 나오고요. 개인적인 의견이에요.

취업에 대비해서는 개인적으로 푼 문제의 질이 괜찮고, 잘 이해했으면 백준 400문제 정도만 풀어도 괜찮다고 생각합니다만. 활용문제 연습을 위해 많이 풀면 풀수록 좋습니다. 일부분들은 100문제만 풀어도 충분하다고 하시던데 이건 정말 똑똑한 사람의 경우고,(또는 풀었던 100문제안에서 코테가 나온 경우. 운이 좋은 경우죠.) 네이버 카카오 합격자들도 꼭 백준이 아니더라도 평균적으로는 300-400문제정도는 풉니다.

 

그리고 이거 중요한건데.. ~3단계까지의 알고리즘은 풀이법을 알면 다음부터 혼자서 짤수 있는데 4단계의 일부 알고리즘부터는 이론도 복잡해서 혼자서 짜기가 힘든 경우 이미 있는 코드를 가져와서 변형하는 방식으로 문제를 푸는게 좋습니다.(오해할수 있는데 그냥 갖다쓰라는게 아니라 나중에 짤줄 알아야함.) dp정도는 유형이 워낙 다양해서 왠만해서는 혼자서 짤줄 알아야하고요, 공부하시다 보면 복잡한것들이 나오는데 스스로 판별해서 일정 수준 이상이면 이미 있는거 갖다쓰면 됩니다.

코테가 집에서 보는 온라인 코딩, 면접보면서 하는 손코딩 두가지가 있는데, 온라인 코딩의 경우 문제가 아무리 어려워도 이미 풀어봤었으면 가져다가 응용하면 되는거고,(면접에서 어떻게 짰었는지 털릴수 있으니 반드시 준비해갑니다.) 오프라인의 경우에는 그렇게 복잡한 문제를 손코딩하거나 인터넷,ide 없이 풀어보라고 잘 요구하지 않습니다.(손코딩만으로 어려운 문제 푸는건 면접관도 못합니다.) 
온라인으로 푸는 코딩테스트는 당연히 온라인이니까 베끼기(cheating)의 위험성이 있는데, 대부분 기업들이 이것까지 감안하므로 코딩테스트는 온라인으로 끝!이 아니라 그냥 한번 가볍게 체에 거르기용으로, 알고리즘 공부 안해본사람들 거르기용으로 보신거라고 생각하시면 되겠습니다.

면접 가서 보는 손코딩은 제가 위에 적은 난이도중 ~3단계 또는 ~4단계의 극초반정도까지에요. 

그러니까 굳이 '많이' 어려운거 이해 잘 안가는데 꼭 혼자서 해보겠다고 계속 시간 낭비할 필요가 없이 어려운것들은 유형만 파악해놓으면 된다는겁니다. 알고리즘 문제를 풀 때에 문제를 읽고나서 아 이건 최단 길찾기인 다익스트라로 모델링해서 풀면 되겠다. 라고 방법론이 떠오르면 50%는 푼겁니다. 어려운 문제의 기준을 말씀드리는건 매우 힘들어서 코딩테스트나 면접을 보면서 대충 감을 잡아놓는게 좋습니다.(이 기준은 제가 느끼기에 해마다 조금씩 바뀝니다. 언제는 내가 잘 안풀어봤던 투 포인터 문제가 나올때도 있고 구현이 좀 빡시게 나올때도 있고 그럽니다.) 제가보기에 그래프 알고리즘중 이론이 조금 난이도 있는거(네트워크 플로우라던지 그런것들)이나 kmp같은 문자열 처리 등은 대부분 그냥 이럴때 이걸 쓰는구나 유형만 알아두는게 좋고요.(만들어뒀던거 갖다 쓰면 되니까요.) 아무리 난이도가 올라가도 dp나 이진트리, 탐색, 스택, 큐, 기본적인 문자열 처리 등을 사용한 기본적인(?) 문제 등은 스스로 처음부터 다 짤줄 알아야 합니다. 

근데 제가 몇몇개는 유형만 알아둬라.. 라고 적어도 아닌 경우 나올수 있으니까 그냥 넓게 다 커버해서 공부하는게 당연히 좋죠.

 

 

 

5. 취업대비 알고리즘 익숙해지기, 취업에 나오는 문제 집중 풀기, 한번 푼 문제 바꿔서 풀어보기.

대상자 : 4번 단계 이상자. 알고리즘 공부를 따로 시간내서 몇달,년 이상 해 본 경험이 있는 사람.

 

솔직히 3,4단계까지 혼자서 한 경험이 있으면 이 글을 읽을 필요가 없습니다. 왜냐면 이미 스스로 공부를 잘 찾아서 하는 분이기 때문입니다.(아마 재미로 이 글을 읽고있겠죠.) 그래도 더 도움을 드리자면.. 다시 백준의 문제집에서 공개 카테고리로 돌아옵니다. 그리고 본인이 부족하다고 생각하는 부분의 문제지를 찾아서 풉니다. 저는 dp문제 모음집중 하나인 요 문제집이 괜찮은것같네요.. 이 단계까지 오시면 새 문제를 보면 어떤 종류의 알고리즘을 써야 하는지는 대충 감이 오고, 잘 몰라도 어떻게 이전 코드들을 조합해서 스스로 답을 얻어낼 수 있을 정도의 실력자라고 봅니다.

한번 푼 문제 바꿔서 풀어보기같은 경우는 예를 들자면 아래 문제는 기본적인 알고리즘 시험이거나, 면접 등에서 나오는 유명한 문제중에 하나입니다. 이 문제 분류가 스택이죠. 그리고 4번 단계정도에 있는 분이 저 문제를 풀면 대부분 스택을 사용해 풉니다. 5번 단계정도로 오시면 조금 바꿔서 풀수 있습니다. 변수 선언 후 열린 괄호면 +1을 하고, 닫힌 괄호면 -1을 해서, 마지막 변수의 값이 0이면 맞는.. 그런 식으로 풀수 있습니다.(사실 이것도 따지면 스택하고 비슷한 방법이긴 합니다.) 사실 더 나아가서는 획기적이거나 변태적인 방법이 몇몇 있긴 하지만 그렇게 짜시는 분들은 이미 잘 하시는 분들이므로 그냥 감탄하고 넘어가시면 되겠습니다. 위의 스택 문제는 최근 포스팅한 https://qkqhxla1.tistory.com/1003?category=685989 요 글의 맨 아래의 링크처럼 아주 간단하게 해결도 가능합니다.

이 스택 문제를 적었던 이유는.. n사 공채 알고리즘 테스트에 이 문제가 그대로 나왔기 때문이죠. 손코딩으로 적어야 했는데 시간이 급박해서 스택으로 하나씩 넣고 빼는 방법으로 풀면 시간이 부족해서 더 짧은 알고리즘을 써야 했습니다. 이때 만약 위에 글처럼 replace로 구현하면 면접관이던 채점자던 본 사람한테 인상이 남겠죠?

 

숏코딩에 대해 좀더 적자면 숏코딩을 정말 효율적으로 멋있게 하면 면접관에게 아주 강한 인상이 남지만, 잘못하면 정말 최악이 되버리는 경우도 있습니다. 예로 32비트를 넘어가는 정수에 대해 덧셈을 구현하라. 라는 문제가 면접에 나왔는데 파이썬은 32비트가 넘어가도 숫자로 표현하거든요? 하고 int(a)같이 답을 내면 그건 정말 최악의 답입니다.

면접관이 보고싶은건 이게 아니기 때문이죠.. 위의 replace같은경우는 파이썬이라는 언어만의 꼼수(cheating)를 썼다기보다는 똑똑하다는 느낌이 드는 코드이니 긍정적이라고 보고요.

파이썬이라는 언어의 기본 내장 함수중에 이런 편한것들이 많아서 특히 주의를 해야하는데 채점자들의 심기를 거스르지 않을만큼(??) 이정도야 뭐. 라고 생각하는 정도만 살 골라쓰는게 중요합니다. 파이썬이 코딩테스트에 가장 유용한 언어라는말이 이것들 때문에 나오는거고요.

파이썬이 코딩테스트에 좋긴 하지만 백준에서 문제를 풀다보면 시간 초과 때문에 파이썬으로는 못 푸는 문제들이 있습니다. 이런 경우를 대비해 (c++ or java)한개하고 같이 하면 더 좋죠. 저도 파이썬으로 풀다가 시간초과로 못 푸는 문제는 c++로 풀었었습니다.(백준의 경우 로직은 안바꾸고 언어만 바꿨는데 통과하는 경우가 있더군요.)

 

 

6. 알고리즘 대회 준비?, 면접 문제 난이도.
제목에서 적었듯이 제가 5번 단계에서 멈춰서 심화해서 준비하는 분들에게는 더 조언을 드릴 수가 없겠네요. 예상대는 바로는 문제를 많이 풀어보고.. 비주류의 모든 알고리즘까지 다 공부해봐야 한다는점.? 

 

일반적으로 스타트업의 경우 2~3단계 난이도의 문제가,(사실 스타트업도 스펙트럼이 넓습니다. 제가 적은건 토스, 쿠팡, 야놀자같은 이미 큰곳 말고 작은 스타트업..) it 중견기업의 경우 2~4단계의 문제가, 탑티어 it기업의 경우 2~5단계정도의 난이도가 나옵니다. 중소기업의 경우에는 시험을 본다 해도 전공문제를 보지 코딩테스트는 잘 안 봅니다. 코딩테스트 준비할정도로 공부했으면 당연히 중소기업 안 가죠. 대기업도 2~4단계가 많이 나옵니다. 당연히 다 잘하면 좋겠지만 그래도 본인이 가고자하는 기업에 맞춰서 공부하시면 되겠습니다. 

그리고 이것들은 전부 신입공채 기준입니다. 경력은 탑티어 기업이어도 대부분 높아야 ~4단계 초반이에요.

맨 위에 적었듯이 전 3단계정도에서 시작해서 5단계까지 넉넉하게 준비가 되었다라고 느낄정도로 공부하는데 5개월이 걸렸어요. 참고하셔서 하시길 바랍니다.

 

 

7. 효율적인 취준을 위한 추가정정. (2020/07 추가)

전 백준으로 시작해서 백준으로 끝을 낼만큼 많이 풀어서 왠만한 범위를 다 커버친것같은데.. 지금 느끼기에는 leetcode의 easy와 medium을 다 푸는게 더 괜찮은것 같습니다.(특히 medium이 괜찮고, 공채 신입 준비면 hard까지 풀어보는게 좋습니다.)

이유는 leetcode가 문제 적중률이 많이 높은것같고, 백준에는 알고리즘 대회 준비를 위한 알고리즘이 많은데 처음 공부하는 입장에서는 이게 대회용이라서 취준 코테에 진짜 거의 안나오는 알고리즘인지를 판별하기가 힘들기 때문입니다. 물론 전부다 공부하면 좋겠지만 시간대비 효율이 안 좋죠. (예로 저같은경우 네트워크 플로우, 아호코라식, ccw, scc, minimum cut 이런것까지 살짝 공부했는데 코딩테스트에는 이런거 안나옵니다. 전 한번도 코테에서 이런것들 나온거 본적이 없고, 아마 미래에도 나올리가 없습니다. 대회 준비하는거 아니면 당연히 안하는게 낫습니다.)

결론적으로 현재 생각은.. 처음에 카테고리 관련된 문제를 풀면서 개념을 잡을때는 백준으로 동일한 카테고리 여러문제를 풀어보고 넘어가고, 알고리즘 문제풀이 자체에 익숙해졌다 싶으면 leetcode로 가서 엄청 풀다가 이해안가는 특정 카테고리가 있으면 백준 문제집에서 그 카테고리만 찾아서 푸는게 가장 좋아보입니다.

각 사이트의 장점만 사용하는거죠. 적중률 높은 leetcode를 풀다가, leetcode에서 내가 푸는 카테고리의 문제가 좀 이해가 안간다싶음 문제가 많은 백준와서 그 문제들만 모아서 풀어보는 방식입니다.

 

leetcode공부방법도 적어드리자면...

1. https://leetcode.com/explore/learn/ 여기서 기본적인 카테고리별 문제들을 풀면서 리트코드의 스타일을 익힌다. 

2. 스타일이 어느정도 파악되었으면 https://leetcode.com/problemset/algorithms/ 여기가 문제 모아놓은 곳인데.. 여기서 처음엔 top 100 liked questions들로 정렬해서 풀고, 그다음에 top interview questions를 푼다. 

3. 문제들을 풀때 왠만해서 좋아요가 싫어요보다 많은것들을 푼다. 좋아요가 압도적으로 많은게 좋은 문제이다. 난 싫어요가 더 많은 문제는 그냥 안품.

4. 추가로 결제를 해보는것도 괜찮다. 결제를 하면 잠겨진 좋은 문제들을 풀거나, 회사별로 필터링을 걸수 있거나,(페이스북에서 출제된 문제만 골라푼다, 구글에서 출제된 것만 골라푼다 등) 내가 가장 괜찮았다고 생각한 필터인 문제가 나왔던 빈도순으로 정렬을 할 수 있다.

1달짜리가 35달러(약 4만원), 1년에 159달러(약 19만원)인데 결제는 2.에 적은 top 100 liked와 top interview를 둘다 어느정도 끝낸 후에 해보는걸 추천한다.

 

 

8. 제가 풀었던 문제들을 참고하세요.

가장 처음에도 적었지만 제가 현재까지 풀었던, 풀고있는 문제들은 

https://qkqhxla1.tistory.com/category/algorithm/problem%20solving 여기에 포스팅해놨고, 포스팅 중입니다.

저도 안풀다가 몇개월만에 문제를 풀면 잊어버리는게 당연하기에, 제가 이전에 풀었던 문제들을 종종 찾아봅니다. 카테고리에 들어가서 글 제목들을 보면 아시겠지만 제가 푼 문제가 어떤 카테고리였는지 적혀있습니다. bfs면 bfs다. 스택이면 스택이다, 트리면 트리다. 트리 문제이고 예전에 풀었던것 같은데 기억이 안나면 저도 제 블로그에서 트리라고 검색해서 찾아보는 경우도 많이 있습니다. 글 제목에 분류를 적은건 나중에 찾아볼때 효과적으로 빨리 찾아보기 위함이에요.

특정 문제만 골라서 풀어보고 싶으시면 제 블로그에서 그거로 검색해서 나오는 문제만 골라푸시면 됩니다.

그리고 문제 포스팅시에 왠만해서는 난이도가 너무 낮거나 이상한 문제는 되도록 잘 안넣으려고 노력했어요.(난이도가 너무 낮은 문제는 거의 없을건데, 비슷하게 반복되는 문제는 좀 있습니다.)

공부할때 제가 풀었던 문제 순서를 따라가도 괜찮을것 같습니다.

 

 

나름 블로그에서 핫글이고 몇년 전 정보라 정정을 위해서 추가정보 남깁니다.

제가 수정을 자주 하긴 했지만 베이스는 2019년에 쓴 글임을 고려하고 읽어주시면 감사하겠습니다.