알고리즘 초보에서 벗어나기 위한 여정

알고리즘 초보의 알고리즘 공부과정

어느 순간부터 꼭 이루고 싶은 목표의 장애물이 알고리즘이 되었다. 올해는 그 장애물을 꼭 넘고 싶어서 어쩔 수 없이 알고리즘 실력을 키워야만 하는 상황이 되었다. 그래서 이번 기회에 알고리즘 초보에서 벗어나서 코딩 테스트를 통과하겠다는 목표로 2019.12.31 부터 2020.04.26까지 알고리즘 주로 공부했다. 이 글에서는 어떻게 알고리즘을 공부했는지에 대한 과정 및 방법에 대해 공유하고자 한다.

각 단계의 산출물은 ClaudiaJKang/DA-AR 레포에서 확인할 수 있다.

1. 1단계 : 2019.12.31–2020.02.05 (37일)

working branch: step12 branch

1) 목표

Hackerrank 자료구조 & 알고리즘 Easy, Medium 난이도 문제 다 풀기

2) 알고리즘 사이트 선정

일단 제일 먼저 어떤 사이트(백준, hackerrank, 프로그래머스 등등)를 바탕으로 공부할 것인지 선정했다. 그 당시 나는 영어공부도 하고 싶고 알고리즘도 공부하고 싶었기에 hackerrank로 선정했다.

3) WBS 만들기

(1) ~ (3) 단계에 걸쳐서 WBS를 구성하였다.

세로는 알고리즘 문제, 가로는 날짜

  • (1) hackerrank의 자료구조와 알고리즘에 대한 문제 리스트를 모두 정리
  • (2) 엑셀에서 자료구조(D) / 알고리즘(A), 문제 분류, 난이도(Easy-E, Medium-M, Hard-H), 문제이름 순으로 정리

인쇄할 것이기 때문에 최대한 A4용지에 다 들어올 수 있도록 하였다.

  • (3) 날짜를 기입할 수 있는 칸 추가

4) WBS를 바탕으로 공부하기

알고리즘을 공부할 때, 항상 2)에서 완성한 WBS를 프린트해서 가지고 다니면서 문제를 풀고나서 바로바로 시각화 작업을 시작하였다.

시각화를 위해서 보라색은 푼 문제, 하늘색은 풀고 있는 문제, 남색은 풀었지만 어려운 문제, 핑크색은 어려운 문제 이렇게 규칙을 정하고 시작했다. 처음에는 색깔만 칠하다가 4일차 부터는 한 문제에 얼마나 시간을 투자하는지 알고 싶어서 한 문제를 풀때 시간도 기록했다.

첫 1주일은 쉬운 문제들 위주로 풀다 보니 약간 어려움 없이 풀 수 있었는데, 2–3주차에는 medium 난이도 문제를 풀기 시작하면서 어려움이 배가 되기 시작했다. 그 문제를 하염없이 붙잡고 있다보니 지치기 일수였고, 이게 알고리즘 공부를 하다가 딴길로 새는 원인이 됬다. 그래서 4주차부터는 medium 난이도는 과감하게 스킵하고 easy위주로 풀었다. 이렇게 진행하니 진도가 더 잘나갔고, 5주차에 hackerrank 자료구조 문제와 알고리즘 Warmup, Implementation 문제를 다 풀 수 있었다.

5) 1단계 결과

자료구조 위주로 공부는 했는데, 리뷰를 안하고 계속 문제수만 채우는데 급급해서 쉬운 문제는 쉽게 풀고, 조금만 변형된 문제가 나오면 풀지 못하는 그런 상황이 반복되었다. 그래서 다음 단계에는 리뷰 작업을 추가하기로 했다.

2. 2단계 : 2020.02.06–2020.03.15 (39일)

working branch: step12 branch

0) 공부 방법 수정

첫 1단계를 하는 과정에서 친구가 BOJ 관련 공부법에 대한 포스팅을 하나 알려줬다. 그건 BOJ 길라잡이 였는데, 첫 4문제를 시험삼아 풀어봤는데 생각보다 어려웠다. 그래서 구글에서 BOJ에 대한 공부방법 포스팅을 더 찾아봤는데, 알고리즘 문제풀이(PS) 시작하기 이 포스팅을 접하게 되었다. 그래서 이번 2단계에서는 이 두 가지 포스팅에서 말하는 공부방법을 적용해보기로 했다.

1) 목표

BOJ 길라잡이알고리즘 문제풀이(PS) 시작하기 내의 문제 다 풀기

2) 알고리즘 사이트

백준

3) WBS 만들기

(1) BOJ 길라잡이알고리즘 문제풀이(PS) 시작하기의 문제 리스트를 모두 정리

  • (2) 엑셀에서 문제 분류, 문제 번호, 문제이름 순으로 정리

순서는 알고리즘 문제풀이(PS) 시작하기 포스팅을 기준으로 하고, 두 사이트에서 모두 언급하는 문제는 색깔로 표시해주었다.

  • (3) 날짜를 기입할 수 있는 칸 추가

4) WBS를 바탕으로 공부하기

이번에는 1주차와는 달리 만약 풀기 어려운 문제가 있다면, 그 다음날 꼭 리뷰해주는 것을 목표로 했다. 그리고 5분안에 그 문제를 풀 수 있으면 리뷰가 완료된 것이라고 여기고 넘어갔다.

주로 알고리즘 문제풀이(PS) 시작하기 블로그에서 제시해준 방법대로 진행했는데, DP부터 막히기 시작해서, 약간 공부 순서를 수정했다.

입출력 -> DP 조금 -> 스택 -> 큐/덱 -> 문자 -> 링크드리스트 -> 수학 -> 그래프 -> DP -> 이분탐색 -> 분할정복 -> 그리디 -> 완전탐색

공부를 하면서 생소한 이론은 대회알고리즘, Ries 마법의 슈퍼마리오 블로그를 보면서 공부해나가면서 풀었다. 그리고 1문제를 푸는 시간이 만약 2시간 이상 넘어가면 풀 수 없다고 정의하고, 해답을 찾아서 이해하려고 노력했다.

그 결과, 목표했었던 문제 154문제 중 130문제를 풀었다.

5) 2단계 결과

1단계 때와는 달리 어려운 문제는 계속해서 리뷰를 진행해서 비슷한 유형의 어려운 문제를 만나도 쉽게 풀 수 있게 되었다. 그리고 알고리즘을 어떤 순서대로 공부해야 되는지에 대한 조금의 감?을 얻게 되었다.

3. 3단계 : 2020.03.20–2020.04.25 (37일)

working branch: step3 branch

0) 공부 방법 수정

2단계 공부 과정에서 알게된 대회알고리즘, Ries 마법의 슈퍼마리오 를 바탕으로 알고리즘을 공부해보기로 했다.

1) 목표

대회알고리즘, Ries 마법의 슈퍼마리오 블로그의 자료구조, 이분탐색, 정렬, 그리디, 완전탐색, DP, 문자열, 분할정복 포스팅에 있는 문제를 다 풀기

2) 알고리즘 사이트 백준

3) WBS 만들기

공부 순서 : 자료구조(링크드리스트, 스택, 큐, 덱, 힙, 트리, 그래프) -> 이분탐색 & 정렬 -> 그리디 -> 완전탐색 -> DP & 문자열 & 분할정복

  • (3) 날짜를 기입할 수 있는 칸 추가

4) WBS를 바탕으로 공부하기

2단계 때 리뷰했던 것보다 더 조금 빡세게 이해될 때까지 리뷰과정을 진행했고, 1개의 개념을 계속해서 파기보다 여러가지 개념을 하루에 여러개씩 푸는 방법으로 공부했다. 그리고 2단계에서 개념을 공부했지만, 한번 훑는다는 느낌으로 개념도 다시 봤다.

그리고 이번 단계에서는 푸는 문제가 1시간이 넘어가면 바로 답을 찾아봤다. 이번에 공부하면서 정말 효과적이었던 이유 중에 하나는 대회알고리즘, Ries 마법의 슈퍼마리오 에는 풀이가 있다는 것이었다. 이 블로그 작성자님의 백준 아이디가 네이버 블로그 아이디와 동일한데, 만약 못풀겠으면 이분 풀이를 보고 이해를 하면 이론에서 이해했던 방법대로 접근해서 풀 수 있어서 효과적이었다.

또한, 이번 단계에서는 2단계보다 리뷰를 많이 한 만큼 계속해서 깔끔한 코드로 만들어 나가는 작업도 같이하였다. 그래서 이번 단계에서는 165문제를 풀었다.

5) 3단계 결과

2단계에 걸쳐서 알고리즘을 미리 공부했다 보니 1, 2단계보다 알고리즘을 푸는 속도는 훨씬 빨라졌지만, 어려운 문제를 만났을 때 혼자 못푸는 경우도 생각보다 많았다.

4. 결론

의도한 것은 아니지만 약 37일씩 3단계 걸쳐서 공부를 진행하고 나서 보니, 새로운 문제를 많이 접하는 것도 중요하지만 그 것보다 중요한 것이 리뷰과정이라는 것을 알게 되었다. 막상 리뷰로 하다보면 리뷰 시간이 생각보다 오래 걸려서 스킵하고 싶어지는 마음이 커지지만, 결국 이 시간이 나의 실력을 만든다고 생각하고 버텼다. 그 결과, 코딩 테스트가 시작되고 나서 문제를 딱 접한 순간 이 문제 백준에서 풀었던 문제다 라고 할 수 있었던 문제를 많이 볼 수 있었다. 그 외에도 내가 보지 못했던 문제도 차근차근 문제를 읽다 보면 어떤 알고리즘 방법으로 이 문제를 풀 수 있겠구나 라는 것이 보여서 어려움 없이 코딩테스트를 통과할 수 있었다.

I love self-development and I primarily write about solving problems about computer engineering and personal stories.

I love self-development and I primarily write about solving problems about computer engineering and personal stories.