코딩테스트 공부 방법 & LeetCode May Daily Challenge Complete

wannte·2020년 6월 1일
1
post-thumbnail

카카오 인턴 코테, 프로그래머스 서머 코테를 통과한 겸, 내가 제일 좋아하는 LeetCode May Challenge를 완료한 겸해서 지금까지 나의 알고리즘 공부방법을 소개하고자 한다. 시간 순서대로 4가지정도 스텝으로 진행된다.

참고로 본인은 알고리즘 공부를 시작한지 9개월 정도밖에 안된 뉴비이다. 너무 많은 것을 바라지는 말자.

1. C언어 -> C++로 진화

우선 작년 9월 알고리즘 스터디를 시작하며, 4년전에 배웠던 C언어를 다시 꺼내들었다. malloc이니 뭐니 하나도 기억안나는 데, 혼자 공부해서 끙끙되고 있는데 옆에서는 vector니 auto니 개꿀 스킬 시전중이었다. 나중에는 stack이니, queue니 sort니 이미 다 구현되어있었다. 진짜 어떻게 해서든 나도 이 꿀 빨려고 발악하고, 발악했던것 닽다. 이 때까지만 해도 C++ 정말 신세계였다고...

2. '스터디'하세요 여러분

알고리즘에 A자도 모르는 나에게 스터디는 구세주였다. 우리 스터디는 매주마다 하나의 알고리즘을 정하고 이를 수업하는 방식으로 진행됬다. 정말 공격적으로 질문하고, 활발한 지식의 습득 과정이 이뤄젔다.
그의 명언을 남긴다.

"알고리즘을 모르는 사람을 이해시키지 못하면, 그건 아는 것이 아니다"

또 우리는 github를 활용하여 활발한 코드 리뷰를 진행했다. 처음 내가 봐도 이해하는 데 1시간이 걸리는 코드는 뚜들겨 맞으면서 이제 조금 볼만해졌다. 또한 다른 사람 코드 보면서, 저 사람은 어떻게 꿀빨았는지 항상 모니터링했다. <- 개인적으로 이게 매우 중요하다 생각한다.

3. Python은 '사랑'입니다.

C++이 커피라면 Python은 TOP다. 이 기능은 없을까?라는 걸 구글링 해보면 대부분 구현된게 있으며, 잘만 짜면 한줄짜리 코드도 많이 나온다. reduce, filter, map, 딕셔너리 등등 정말 편리한 기능들이 많다. 또, 이번 코테때 regular expression 써볼려고 각잡고 있었는데, 딱 나와줘서 좀 느낌있게 풀 수 있었다.

개인적으로 파이썬을 매우 좋아하지만, C/C++을 조금 공부해보고 오는 것을 추천한다. 사용하는 함수가 어떤 시간복잡도를 가질지, 어떠한 내부 기작을 가지는 지 유추할 수 있는 힘을 길을 수 있었다.

파이썬을 쓰면서 가장 애먹었던 부분은 mutable/immutable한 객체의 차이와 shallow copy deep copy의 개념들이 었다. 이에 관해서는 따로 포스트를 할 예정이다.

4. LeetCode.. 그냥 해라

백준에서 시작해서 코드포스, 코드워즈 등등 다양한 플랫폼에서 코딩테스트를 풀어봤는데, LeetCode는 어나더 레벨이다.
대부분 코테 문제나 백준의 문제들을 알고리즘 외적으로 수식여구가 많은 반면에, 리트코드는 수식여구를 다 빼고, 퓨어한 알고리즘의 문제라 할 수 있다. 코테를 대비하기 위해서 복잡하게 설명되어진 문제를 풀어보는 것도 중요하지만, 이는 몇문제 만으로도 충분하다. 대부분의 문제는 그 알고리즘 자체를 나만의 언어로 얼마나 빠르고 깔끔하게 구현해내는게 관건이라 생각하며, 이에 매우 적합한 플랫폼이 LeetCode이다.

내가 주로 이용하는 서비스는

  1. LeetCode Challge
    매일 한국시간 기준 오후 4시에 한문제씩 업로드가 된다. 개인적으로 목표는 그 날 오후에 풀고, 다음날 오전에 보면서 그 풀이를 깔끔하게 다시 정리하는 것을 목표를 두지만, 그게 잘 안된다.
  2. LeetCode Contest
    일요일 오전 11시 30분~오후 1시까지 4문제를 푸는 Contest이다. 그 4문제를 10분 언저리에 푸는 사람들을 보며 현타가 오지만, 그래도 가끔 풀만하다.

추가적으로 LeetCode는 주어진 자료구조를 활용하는 문제도 많다. 백준에서 풀었을 때, 내가 만약 트리나 링크드 리스트를 사용하기 위해선 직접 다 구현해 내서 사용해야한다. 개인적으로 거의 사용한 기억이 없으며, 쓰겠다는 생각을 해본적도 없다. LeetCode의 경우에는 tree클래스를 구현해주고 문제를 해결해보라고 제시해주며, 아! 이럴때는 트리를 사용해보면 좋겠구나!와 같은 생각의 확장을 할 수 있다. 또한 문제를 O(nlogn)으로도 통과가 되지만 그럼 O(n)으로 풀어보래? 와 같은 새로운 알고리즘의 풀이를 유도해주는 것도 매우 큰 장점이라 생각한다.

그냥 내 자존감 높이기용

5월달 챌린지 모든 문제를 다 풀어냈다. 앞에 3문제는 그 때, 시간을 놓쳐서 상품을 못받게 됬지만, 매우 만족한다.
저 문제중에서도 다듬어야할 문제들이 많이 있지만,,, 쉽사리 시작하기가 두렵다. 시험기간이라 June챌린지는 다 해낼 수 있을지는 모르겠지만, 그래도 다 푸는 것을 목표로 한다. 여러분도 함께 도전해봅시다!

profile
The Process

0개의 댓글