프로그래머스 코딩테스트 난이도 - peulogeulaemeoseu kodingteseuteu nan-ido

우선 본인은 올해 10번 이상의 코테를 경험하면서 50문제 이상 풀어봤고, 그중 못 푼 문제는 단 3문제임.

라인 3번, 카카오 인턴 4번, 수시채용 1문제.

중수라고 표현한 이유는 다푼게 아니라 3문제 못풀어서. ㅎㅎ

그리고 본인은 알고리즘 개좆밥임. 코테도 올초까지는 개좆밥이었음.

굳이 어려운 알고리즘 공부 안해도 코테 잘 볼 수 있다. 물론 너가 머리가 된다는 전제하에.

코테 개좆밥들에게 이 글이 도움이 됐으면 한다.

1. 선행지식

코테에서 요구하는 자료구조와 알고리즘의 수준은 다음과 같다.

자료구조: array, linked list, stack, queue, deque, tree, graph, BST, heap, hash table (r-b tree, trie 몰라도 됨)

알고리즘: big-O, sorting, brute force, recursion, iteration, binary search, BFS/DFS, backtracking, divide and conquer, bit manipulation, two pointers, sliding window, dynamic programming (topological sort, union-find, KMP 몰라도 됨)

위의 것들 중 자료구조는 반드시 개념을 모두 익혀두어야 한다. 그래야 문제를 풀 때 컴퓨터적으로 사고할 수 있다.

알고리즘은 big-O 말고는 문제를 풀면서 자연스럽게 익히게 되니 따로 공부할 필요 없다. big-O 개념은 반드시 미리 알아두자.

또한 적어도 하나의 프로그래밍 언어에 능숙해야 한다.

보통 c++, 자바, 파이썬을 많이 쓰는데, 자바는 너무 장황하기 때문에 나는 c++이나 파이썬을 추천한다.

그리고 해당 언어에서 문제를 푸는데 유용한 팁 같은 걸 익혀두면 좋다.

예를 들어 나는 파이썬을 많이 쓰는데, [[] for _ in range(n)] 같이 list comprehension을 사용하면 편하다.

2. 어떤 문제를 풀어야 하는가?

결론부터 말한다. 백준 풀지 말고 릿코드 풀어라.

왜 그래야 되는지는 3가지의 이유가 있다.

1) 문제 난이도

백준은 알고리즘 대회를 준비하는 애들이 이용하는 사이트이다. 알고리즘 대회에 나오는 문제 난이도는 코테와 비교불가다.

비유하자면 수능에서 4점짜리 문제들이 알고리즘 대회 문제고, 2점짜리들이 코테 문제다.

우리는 2점짜리만 맞히면 되는데 4점짜리를 맞기 위한 공부를 한다? 당연히 쓸데없는 짓이고 니 머리만 빠개진다.

솔브드 써서 골드 이하만 풀면 안되냐고? 그래도 문제가 너무 많을 뿐더러 문제의 질도 들쑥날쑥하다.

릿코드는 모든 문제가 실제 해외 기업 인터뷰에서 출제된 문제들이다. 따라서 대부분이 적절한 난이도이며 문제 질도 뛰어나다.

2) 온라인 저지 환경

백준에서 문제 풀때 백준 에디터에 쌩으로 코드 작성해서 제출하는 빡대가리는 없을 거라고 생각한다. 대부분 다른 에디터나 ide에 작성한 다음 복붙해서 제출할 것이다. 반면 릿코드는 에디터가 잘 되어있어서 별개의 에디터가 필요 없다. 디버깅도 가능하다.

그리고 백준은 문제 풀때 표준 입출력을 사용한다. 이게 엄청 어려운 건 아니지만 은근히 귀찮다. 그리고 코테 중에 표준 입출력을 사용하라고 하는 데는 한군데도 없다. 릿코드는 그냥 함수만 작성하면 된다.

마지막으로, 백준은 씹덕들이 테케를 쥰나게 많이 기여해놔서 채점이 오질라게 오래 걸린다. 릿코드에서는 그럴 일 없다.

3) 커뮤니티

백준 게시판: 60%에서 막히는데 뭐가 문제인가요?, 어디가 틀렸는지 모르겠습니다 ㅠㅠ, 반례좀 찾아주세요 ㅠㅠ

릿코드 discussion: JAVA solution beats 100%, Easy and consice O(n) C++ solution, O(1) space solution with easy explanation

제목만 봐도 어디가 더 도움될지 알 수 있다.

따라서 나는 백준이 아닌 릿코드를 풀기를 추천하고, 아래에서도 릿코드를 기준으로 설명할 것이다.

또한, 우리나라의 많은 회사들이 코테 환경으로 프로그래머스를 사용하기 때문에 프로그래머스도 같이 풀면 좋다.

3. 어떻게 풀어야 하는가?

1) 모든 문제를 풀어라

릿코드에서 algorithm으로 분류된 모든 문제를 풀어라.

Easy라고 거르지 마라. 싫어요 많다고 거르지 마라. 너같은 개좆밥은 문제 가릴 처지가 아니다.

2) 한 문제당 시간제한을 두어라

구글에서는 한문제 푸는데 45분을 주는데, 이 정도 시간이 적당하다고 생각한다.

문제 읽기 시작부터 제출까지 시간재고 풀고, 시간 넘으면 과감하게 포기해라.

한문제에 끝까지 매달리는 것보다 여러 문제를 풀고 못 풀더라도 피드백하면서 배우는게 더 효과적이다.

3) Follow up 무시하지 마라

가끔 문제 밑에 Follow up이라 해서 추가조건을 제시하는 문제들이 있다. 선형시간 안에 풀으라거나 O(1) 공간복잡도 제한 같은.

이런 문제는 이 follow up이 본 문제다. 이걸 풀어야 이 문제를 진짜로 푼 거다.

그러므로 좆만하게 써있다고 무시하지 말고 꼭 풀어라.

4) 히든 테스트케이스 보지 마라

릿코드는 코드를 제출하면 틀렸을 때 input을 보여준다.

그런데 실제 코테에서 히든 테케를 보여주는가? 그럴 일 없다. 심지어는 테케를 통과했는지도 안알려주기도 한다.

5) Discussion은 반드시 봐야 한다

일단 문제를 못 풀었으면 풀이를 봐야 하니까 당연히 봐야 하는 거고

중요한건 니가 문제를 풀었더라도 discussion은 반드시 봐야 한다.

너보다 더 좋은 시간/공간복잡도를 가진 답안이 있을 수 있고, 같은 로직이라도 너는 존나 복잡하게 코딩한 걸

다른 사람은 더 쉽게 작성했을 수도 있다. 

좋아요를 많이 받은 코드는 이유가 있다. 보고 배울 수 있는 걸 배워라.

니가 모르는 언어로 되어있어도 읽어라. 어자피 다 C에서 유래한 거라 읽는 건 가능하다.

나는 discussion 보는게 문제 푸는 것 이상으로 중요하다고 생각한다.

나는 릿코드 200솔 하고 나서부터 어떤 문제든 풀 수 있다는 느낌이 들더라.

실제로 그 뒤에 봤던 코테들은 틀린 적이 없기도 하고.

아무쪼록 열심히 해서 좁밥 탈출하길 바란다.

코딩 테스트 준비


  • Level 1
  • Level 2
  • Level 3
  • Level 4
  • Level 5

코딩테스트를 위해 어려운 문제, 지난 코딩테스트 문제들만 골라 풀다보니 문득 특정 알고리즘들이 약하다는 것을 깨닫고 프로그래머스 Level1 문제부터 차근차근 풀어보고 느낀점이 무조건 Level1 부터 풀고 공부해야 합니다. 각 Level에 따라 필수적으로 익숙해져야하는 부분들이 몇가지 있었습니다.

프로그래머스 코딩테스트 난이도 - peulogeulaemeoseu kodingteseuteu nan-ido

Level 1

Level 1 문제는 정말 쉽습니다. 하루에 30문제정도씩 풀 수 있을 만큼 쉬운 난이도지만 문제를 풀고 다른사람의 풀이를 보면 배울점이 차고 넘칩니다. 나는 5~6줄 걸려 푼문제를 2줄 컷해버리는 사람들이 대부분입니다. Level 1 에서 꼭 익숙해 져야하는 라이브러리 및 잡기술들은

  • functools.reduce
  • itertools.product
  • lambda
  • 내포리스트
  • 한줄 if
    • Ex) answer = 3 if 조건 else 0
  • map
  • *
  • zip
  • collections.Counter

뭐 대충 이정도가 있을것 같습니다. 이정도에만 익숙해져도 10줄 걸릴 코드 3~4 줄로 줄여버릴 수 있으니 수정하기도 편리해지고 라이브러리를 이용하니 효율성도 증가됩니다.

Level 2

보통 코딩테스트 1, 2 번 문제로 나오는 문제의 난이도 수준입니다. Level 1이 라이브러리만을 이용해 풀 수 있었다면 Level 2 부터는 특정 알고리즘의 풀이방식을 및 접근법 알아야합니다.

  • Stack/Queue
  • Greedy
  • 정규식

특히 Stack/Queue 풀이법은 모르면 절대로 풀 수가 없습니다. 한번 익숙해지면 간단하지만 Stack/Queue의 특성을 어떤식으로 이용해서 문제를 푸는지 꼭 익숙해져야 합니다.

Level 3

코딩 테스트 중간보스급 수준의 문제입니다. Level 2는 문제를 보면 ‘아, 이런식으로 하면 되겠구만’ 하는 느낌이드는데 Level 3부터는 대부분의 문제들이 ’?’ 하게 만듭니다. 특히 DP, Dynamic Programming을 해결하는 느낌은 확실하게 이해하고 넘어가야합니다. 제 기준으로 모든 알고리즘 통틀어 DP종류의 문제가 가장 어렵습니다. 왜냐하면 DP는 직관적이지 않고 간접적인 객체들로 구성되어있어 풀이를 봐도 이해하기가 매우 어렵습니다. 이거는 직접 맞아보시면 무슨말인지 이해가 갈겁니다. 거스름돈 문제가 DP를 이해하기에 가장 기초적이면서 좋은 문제입니다.

  • DP
  • DFS/BFS, Graph
  • Recursion
  • 효율성
  • BinarySearch
  • Heap, Priority Queue

난이도는 DP , BinarySearch 문제가 가장 어렵고 나머지는 적당한 수준입니다.

Level 4

코딩테스트 가장 어려운 난이도 수준의 문제입니다. 딱히 새로운 알고리즘을 통한 접근법은 필요가 없지만 Level 2, Level 3 문제에 아주 까다로운 조건이 몇개 들러붙어 코딩하기 어렵고 접근하기 어렵게만든 수준입니다.

Level 5

구글링을해도 풀이가 나오지않는 문제가 대부분이고, 접근조차 어떻게 해야할지 감이 안잡히는 수준의 문제입니다. 거의 9만명 중 문제푼 사람이 적게는 4~100명 밖에 없는 정답률 0.00004% ~ 0.001%의 문제입니다.