평생 못 갈 줄 알았던 플레가 되었다!
기념으로 후기 글을 써보려고 한다.
참고로 여기서 말하는 공부방법은 개인적으로 도움이 됐던 공부방법을 공유하는 거라 이 방법이 다른사람에게는 정답이 아닐 수 있다. 참고용으로만 읽고 자신과 잘 맞는 공부방법을 찾는 게 좋을 것 같다.
글쓴이는 알고리즘 관련 강의를 하나도 사지 않았고, 알고리즘 유형들은 대학교 수업에서 많이 접해서 어느정도 아는 수준이었다.(돌아가는 로직만 알고 코드는 짤 줄 몰랐다)
공부기간(2023.7 ~ 2024.2)
브론즈 문제를 찔끔찔끔 풀다가 작년(2023) 7월쯤부터 본격적으로 공부를 시작했다.
이후 개발동아리를 하면서 조금 손을 놓고있다가 9월 중반부터 싸피입과 전까지 계속 알고리즘을 공부했다. 싸피 입과 후에는 알고리즘 스터디를 하면서 찔끔찔끔 올려서 플레로 갔다.
공부 시행착오 3가지
알고리즘을 처음 공부할 때 시행착오를 많이 겪었다. 크게 꼽자면 3가지다.
- 프로그래밍 언어 문법을 잘 모르는데 문법부터 공부해야하지 않을까?
- 사람들이 문제 유형을 먼저 보지않고 풀어야 실력이 는다고 했다. 근데 유형이 뭔지도 모르는데 뭘 풀어야하지?
- 어떻게 공부해야하는지 모르겠다. 강의를 사야할까?
1. 문법부터 시작?
나는 1번 때문에 3년동안 백준을 시작도 못했었다. 이게 가장 후회가 되는 부분이다.
물론 문법을 조금은 알아야하는 것은 맞지만, 어느정도 수준이 된다면 일단 시작부터 해보는 게 좋다.
어느정도 수준이라는 게 그렇게 높은 수준은 아니다. for문을 돌릴 줄 알고, 별 찍기를 간단하게 할 줄 알고, 간단한 콘솔 프로그램(계산기 등)을 만들 수 있다면 일단 무조건 시작하는 걸 추천한다.
자바로 예를 들면, 객체지향이나 컬렉션에 대해 먼저 공부하겠다는 생각을 제발 안했으면 좋겠다.
물론 미리 해서 나쁠 건 없지만, 이 공부 기간이 길어지는 걸 정말 추천하지 않는다. 여기서 흥미가 떨어져버리면 시작이 너무 늦어진다. 컬렌션은 나중에 배우면 되니까 꼭 문제부터 풀어보는 걸 추천한다.
2. 유형이 뭔데?
알고리즘을 처음 시작하면 정말 막막하다. 문제 유형은 너무 많은데 아는건 하나도 없다. (다익스트라, MST, dfs, 시뮬레이션, 트리, dp 등등)
하지만 일단 해보자는 생각에 문제 양치기를 시작했는데, 내가 풀 수 있는 문제가 하나도 없으면 점점 재미도 없어진다.
글쓴이도 이렇게 시작했는데 점점 흥미가 떨어져서 너무 힘들었다. 그래서 문제 유형을 하나 정해서 브론즈~골드까지 부수는 방법을 선택했다.
이런 식으로 유형별로 브론즈 ~ 골드5 수준까지 도장깨기했다.
이렇게 풀다보면 해당 유형에 대해 이해도도 높아지고, 내가 풀 수 있는 문제도 가끔 나와서 재미도 있었다. 문제를 푼 순서는 다음과 같다.
(그리디) -> dfs, bfs -> 백트래킹 -> 정렬 -> 이진탐색 -> data structures(queue, stack 등) -> 다익스트라 -> 트리 -> 시뮬레이션, 위상정렬, 비트마스킹, MST 등
이 순서대로 한다면 막히는 게 딱히 없을거라고 생각한다. 그리고 다익스트라까지 다 부수면 이 다음에 내가 어떤 유형을 공부해야할 지도 보이게 될거다. 어떤 유형부터 공부해야할 지 막막하다면 가장 간단한 유형인 dfs부터 시작하는 걸 추천한다. (그리디는 그렇게 추천하지 않는다)
나는 해당 유형과 관련있는 백준 문제를 찾기위해 solved.ac 사이트를 활용했다.
위와 같이 태그로 검색해서 레벨별로 정렬하고, 사람들이 많이 푼 문제를 풀었다. (사람들이 많이 푼 문제를 푸는 이유는 참고할 자료가 구글에 많을 것 같아서이다.)
유형별 문제모음은 solved ac말고 백준 문제집에도 있으니 풀고싶은 사람은 그걸 풀어도 좋을 것 같다.
3. 해당 유형을 전혀 모르는데 어떻게 푸냐? 강의를 사야하는 것 아닌가?
위와 같은 방법으로 도장깨기 할 유형을 정했다고 치자. (ex. 다익스트라)
하지만 해당 유형에 대해 전혀 모르는데 문제를 푸는 건 말이 안된다.
여기서 강의를 사는 사람들도 있을거고, 책을 참고하는 사람도 있겠지만 글쓴이는 간단한 유튜브 영상을 본 후 해당 문제를 구글링을 해서 다른 사람의 블로그 코드를 그대로 외웠다.
해당 풀이를 이해하고 2~3번 정도 직접 쳐본 후, 안보고 해당 코드를 작성했다. 물론 구글에 나온 풀이들이 다 맞는 풀이는 아니지만, 잘못된 풀이라도 일단 외우고 다른 문제를 풀다 결함을 발견하면 고쳐나갔다. (ex. 다익스트라의 visit 배열 사용 등)
+) 자바 컬렉션 사용법도 다른사람의 코드를 외우면서 공부했다.
이론을 잘 안다고 해당 문제를 잘 푸는 게 아니라는 걸 느껴서 해당 방법으로 공부했는데 생각이상으로 효과가 있었다. 그리고 다른 사람의 코드를 흡수하겠다는 자세로 문제를 풀면 내 풀이를 몇 시간동안 고집하는 일도 줄어들어서 좋았다.
가장 중요한 것
알고리즘을 공부하면서 가장 중요한 건 꾸준함과 재미라고 생각한다.
나는 내가 골드수준의 문제를 풀 수 있을거라고 생각조차 못했었다. 하지만 꾸준히 하다보니 어느순간 이 수준에 도착해있었다. 또한 내가 풀 수 있는 문제를 발견하고, 참신한 풀이를 발견하는 등 재미요소를 찾으면서 공부하면 꾸준히 할 수 있는 힘이 생기는 것 같다.
아직도 실력이 부족하다고 느끼지만 이제는 내가 어떤 유형이 취약한지, 이 다음 공부해야하는 게 뭔지 보이는 수준에 온 것 같다. 알고리즘을 처음 시작하는 분들은 힘들어도 꾸준히 재미를 느끼면서 공부하다보면 나보다 더 빨리 내수준에 도달할 수 있을 거다!
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA] 백준 문자열 뿌수기 (1) | 2024.03.29 |
---|---|
[JAVA] 백준 MST 뿌수기 2 (0) | 2024.03.18 |
[JAVA] 백준 MST 뿌수기 1 (0) | 2024.02.25 |
[JAVA] 백준 위상정렬 뿌수기 (0) | 2024.02.20 |
[JAVA] 백준 구현 뿌수기1 (0) | 2024.01.13 |