알고리즘 어디까지 풀어봤니 - LeetCoding Challenge
4월 한달간 LeetCoding Challenge를 참여하고 지극히 주관적인 느낌점을 작성해봤습니다.
5월 달에도 열립니다. 어서어서 참여하세요!! May LeetCoding Challenge 참여 링크
LeetCoding Challenge란?
LeetCoding Challenge 는 LeeCode (외국의 프로그래머스 같은 사이트)에서 열린 4월 한 달간 매일 올라오는 알고리즘 문제를 푸는 챌린지입니다. 저는 3월 말쯤 외국계 기업 합격자분의 후기를 읽고 나서 처음으로 LeetCode 사이트를 알게 되었습니다. 그 분께서 이 사이트에서 문제를 풀면서 면접 준비를 하셨다고 합니다. 외국계 회사를 준비하면서 푸는 문제는 얼마나 어려울까하는 호기심 반 두려움 반으로 이 사이트에 처음으로 들어왔습니다.
문제들은 푸는 방식을 알아야만 풀 수 있는 대회 문제와는 달리, 자료구조를 활용해서 푸는 문제들이 대부분이었습니다. “알고리즘”을 얼마나 알고 있냐보다는, “알고있는” 자료구조를 얼마나 잘 활용하는 지를 확인하는 문제다보니, 고민을 하면 충분히 풀수 있는 문제들이었습니다. 그래서 포기하지 않고 꾸준히 할 수 있었던것 같습니다.
삼일 정도 문제를 풀기 시작했을 때, 4월에 LeeCoding Challenge를 연다는 글을 보게 되었습니다. 처음에는 과연 내가 하루에 한 문제씩 꾸준히 풀수 있을까하는 걱정도 있었지만, 무언가를 꾸준히 해보는 습관을 들이자는 다짐을 갖고 신청을 했습니다. 30일을 전부 참여 했을 때는 숨겨진 상품까지 있다길래 무엇일까 기대도 했습니다.
시작한지 이틀이 지나고 숨겨진 상품이 무엇인지 발표 됐는데, 그것은 바로…
두구두구두구
LeetCode 가방입니다!
저 가방을 보고 정말 목표가 생겼습니다..ㅋㅋ 무조건 가방을 받아서 내년에 실리콘밸리에 매고 가겠다는 상상을 하면서 귀찮아도 매일매일 했던것 같습니다.
오늘 들어가서 다시 확인해보니, 전부 주는게 아니고 추첨으로 3명만 주는거더라구요ㅎㅎ 그래도 고맙습니다.. 덕분에 끝까지 완주할수 있었습니다..
1주차!
첫 주차 문제는 그렇게 어렵지 않았습니다. 프로그래머스의 기본 문제 정도의 난이도이거나, 좀 더 쉬운 쪽에 속하는것 같습니다. 한 예로
Example Move Zeroes :
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
0을 배열의 제일 뒤로 보내면 되는 시간 복잡도도 고려하지 않아도 되는 문제들이 나왔습니다. 물론 제약조건은 있습니다. 새로운 배열을 만들지 않고, in-place로 풀어야 합니다.
첫 주는 이렇게 정말 간단한 문제들로 이루어져있습니다. 문제도 깔끔하고, 답을 틀리게 되면 어느 케이스가 틀렸는지 나와서 학습하는데에 도움이 많이 되었습니다.
그리고 문제를 통과하게 되면 내가 푼 정답이 상위 몇 프로에 위치하는지도 알 수있습니다. (가끔 남들보다 빠르게 풀면 정말 기분이 좋습니다..ㅎㅎ) 추가로 생각보다 낮게 나오는 풀이들은 다른 사람의 코드를 보고 발전시켜 나갈수 있어서 좋았습니다. 발전 시켜나가다보면 한달동안 성장하는 것을 느낄 수 있습니다.
저는 29일차 문제에서 정점을 찍어봤습니다. 무려 상위 0.02%가 떴습니다ㅎㅎ 뿌듯하더라구요ㅋㅋ
1주차 문제 바로가기
2주차!
2주차에 접어들면서 슬슬 문제가 어려집니다.. 본격적으로 자료구조를 이용해서 푸는 문제들이 나옵니다. 다행히 기본적인 연결 리스트, 큐, 스택, 힙 정도를 사용할 줄 알면 풀수 있는 난이도입니다.
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
간혹 이렇게 이미 정의 되어있는 자료구조를 사용하는 문제들이 있어서, 익숙해지는데 시간이 조금 필요합니다.
시간은 첫 주에는 문제를 푸는데 평균 20분 정도가 걸렸다면, 이제는 30분 40분 정도가 걸리기 시작합니다.
2주차 문제 바로가기
3, 4, 5주 차!
제 기준으로 3주차 이후부터는 난이도는 비슷한것 같습니다. 다만 문제 유형들이 다릅니다. 3주차에서는 기본 자료구조와 BST(binary search tree)를 사용하는 문제들이 나왔고, 시간은 평균 한 시간 정도 걸렸습니다.
4주차는 조금 더 고급 자료구조와 동적계획법(Dynamic Programming) 문제들이 나오기 시작합니다… 고급 자료구조라 하면 Python기준 집합(set), 딕셔너리(dictionary) 그리고 추가로 순서가 있는 딕셔너리(OrderedDict) 정도가 있습니다. OrderedDict까지 활용하실줄 안다면 무난하게 푸실수 있을겁니다.. 저는 저런 자료구조가 있는지 이번에 처음 알았습니다..ㅠㅠ (내부적으로 어떻게 구현 되어있는지 나중에 다뤄보겠습니다!)
5주차에는 간단한 Tree 문제가 나왔습니다. 그렇게 어렵지 않았고, 2주차 난이도와 비슷했습니다.
3주차 문제 바로가기
4주차 문제 바로가기
5주차 문제 바로가기
TMI
-
문제 풀이는 github 에 올려두었습니다.
-
Pacific Daylight Time 기준으로 시작하기 때문에 한국 시간 기준 오후 4시에 시작합니다.
-
하루 이틀 지나면, 오후 4시만 되면 어떤 문제가 올라올지 궁금해집니다.
-
무언가를 꾸준히 했다는 뿌듯함을 얻을수 있습니다.
-
저는 python - jupyter notebook을 이용해서 풀었습니다.