2024년 7월 10일
드디어 백준 solved ac 플래티넘 티어를 달성했다.
최근 몇일간 플래티넘 티어 달성만을 위해 하루에 12 ~ 15시간씩 노트북앞에 앉아있었던것 같다.
새로운 알고리즘도 몇가지 추가로 공부하게 됐고 기존에 공부했던 알고리즘의 골드난이도 문제들도 풀어보게 됐다.
당장 오늘만해도 새벽 1시30분쯤에 꿈에서 알고리즘 문제풀다가 머리가 아파서 깼고 곧장 또 문제풀이를 시작해서 오전 9시경 완료했다.
고생한 보람이 있으니 오늘은 후기 작성까지만 하고 머리를 조금 쉬게 해줘야겠다.
1. 감회
처음 백준을 시작하던 시절엔 다른 사람들의 닉네임 옆에 뜨는 티어마크가 정말 대단해보였다.
특히나 브론즈, 실버, 골드까지는 색깔만 봐도 무슨 티어인지 알겠지만 플래티넘 이후 티어는 색감도 훨씬 이쁘고 무슨 티어인지 찾아보기 전까진 알지 못했어서 플래티넘부터는 그저 엄청 높은 티어라는 느낌만 갖고 있었다.
하지만 이젠 나도 그 무리들의 꼬리에 붙은 것 같은 기분이다.
2. 공부한 알고리즘
아직 공부해본적 없는 알고리즘도 많지만 플래티넘을 달성한 현 시점까지 공부한 알고리즘들의 목록을 기록해둘까한다.
물론 적어둔 모든 알고리즘을 아주 잘 다루냐고 묻는다면 그렇지 않다.
그래도 대충 본것도 적을 수는 없으니 최소한 개념공부 + 기록 + 백준문제 3개이상은 풀어본 알고리즘들만 남겨본다.
- 복잡도개념
- 누적 합
- 그리디 / 스위핑 / 투포인터
- 비트마스킹
- BFS, DFS, 트리순회
- 최단거리
- 완전탐색, 백트래킹
- 정렬 알고리즘
- 이분 탐색
- DP
- LIS
- 세그먼트트리, 펜윅트리
- 신발끈 공식 : 이건 한문제만 풀어본것같다.
- 유니온 파인드
- MST(크루스칼, 프림)
- 위상정렬
3. 티어가 실력과 비례하는것은 아니다.
오래전 백준을 처음 시작할때 백준 티어에 관해 검색해본적이 있었다.
그때 지금의 이 글처럼 어떤 티어를 달성한 후기글을 본적이 있었는데 그 글에 티어는 무의미한것 같다는 말이 있었다.
그때의 난 그 의미를 이해할 수 없었다.
당시의 내가 보기엔 티어가 높은 사람들이 작성한 코드는 정말 달라보였고, 질문글에 답해주는 높은 티어의 사람들을 보면서 정말 큰 격차를 느끼고 있었기 때문이다.
하지만 이제는 그 말의 의미를 깨닫게 되었다.
티어가 아무 의미가 없는 것이냐고 묻는다면 그건 절대 아니다.
다만 티어와 실력이 꼭 비례하는 것은 절대 아닌것같다.
물론 다이아티어 이상으로 올라간다면 또 생각이 많이 바뀔지도 모른다.
지금의 내가 느끼는 점일 뿐이다.
백준을 시작하면서 처음 느꼈던 티어별 수준은 아래와 같았다.
- 브론즈 : 알고리즘은 몰라도 언어만 알면 풀 수 있는 문제
- 실버 하위 : 알고리즘을 공부하고 사용해보는 예시 문제
- 실버 상위 : 해당 알고리즘을 응용하는 문제
- 골드 하위 : 알고리즘을 응용하는 단계를 넘어서 조금씩 새로운 발상이 필요한 문제
- 골드 상위 : 나는 상상도 못하는 어떤 천재들의 영역
다만 이제는 너무나 다르게 생각한다.
그래프이론이나 DP같은 알고리즘은 너무나 광범위하게 자주 사용되기때문에 누구나 기본 알고리즘으로 초반에 공부하게 된다. 이런 문제들은 기본 예시문제는 실버에서 시작하지만 골드만 되도 엄청 복잡해지고 어려워진다.
반면 세그먼트트리, MST, 위상정렬같이 특정 상황에서만 사용되거나, 기본 알고리즘으로 풀 수 있지만 시간복잡도를 줄이기 위한 알고리즘들은 자주 사용되는것이 아니기때문에 기본 난이도부터 골드에서 시작한다.
그러니까 같은 골드문제라도 DP 알고리즘을 사용해야 하는 경우 아주 어렵게 느껴진다.
반면 세그먼트트리를 사용해야 하는 경우는 단지 사용법만 알면 정말 너무 쉬운 문제도 골드문제다.
사실상 같은 골드문제를 풀었다고 해도 난이도 차이가 너무 심하다.
그러니 지금 생각하는 상위티어는 알고리즘을 아주 잘 사용해야 달성할 수 있는것 뿐만 아니라, 흔히 사용되지 않는 개념의 알고리즘 문제들을 많이 공부하면 달성되는 느낌이다.
다시말하지만 어디까지나 플래티넘을 달성한 지금 시점에서의 생각일 뿐이다.
더 상위티어에서는 무슨 알고리즘을 어떻게 풀고있는지 지금은 전혀 모른다.
내 경우는 개인적으로 DP를 많이 어려워하고, 재귀는 정말 아예 못해먹겠다고 느끼는 편이다.
그래서 공부를 한다면 DP나 재귀쪽을 해야겠지만 티어를 올리는건 전혀 별개의 문제라는 말이다.
하지만 당연히 티어가 완전히 무의미하지는 않다.
그래도 티어를 높이면서 알고리즘에 더욱 재미를 붙일 수 있고 그 과정에서 많은것들이 내공으로 쌓인다.
다양한 알고리즘의 종류를 학습할 수 있을 뿐 아니라 어떤 문제를 어떤 알고리즘으로 해결해야 최적의 상황일지 추론하는 방법도 익힐 수 있고 다양한 생각을 하게되니 분명 실력은 많이 늘게 되어 있다.
또 자신감이 높아지는게 주요한것같다.
위에서 말했듯이 처음에는 골드 상위 문제는 난 절대 풀 수 없는 문제라고 생각했지만 이제는 골드문제가 전혀 무섭지 않아졌다.
단지 쉬운 골드문제를 많이 풀어봤기 때문은 아닌것같다. 몇일간 DP를 사용하는 골드문제도 풀고 그래프이론을 사용하는 골드문제도 풀었지만 확실히 예전에 느끼던 두려움이 완전히 사라진것같다.
이젠 풀이법이 떠올랐음에도 괜히 티어를 보고 제출해봤자 시간초과 뜨겠지라고 지레 겁먹는 일은 없을듯하다.
4. 차후 계획
1) TaskManager 프로젝트 리팩토링해야한다. 한동안은 이것만해도 바쁠듯하다.
2) 소프트웨어 공학쪽 몇가지 공부해야한다.(객체지향의 원칙쪽 내용 일부, 유스케이스/상태/활동 다이어그램)
3) Modern C++ 안본것들 보고나서 Effective Modern C++도 보고 정리할 생각이다.
4) 이쯤되면 또 알고리즘에 대한 감각이 떨어질 수 있다. 먼저 상위 100문제에 실버문제가 16문제 뜬다. 이것부터 골드로 도배해버릴까 한다. 공부할 알고리즘 목록에 아직 남아있는 분할정복/lazy propagation/에이스타/KMP/보이어무어/트라이자료구조 정도를 공부하고 관련 문제들을 풀다보면 또 실력도 늘고 골드도배도 될듯하다.
5) 여기까지 완성한다면 이제 도메인 지식만 쌓으면 되지 않을까 싶다. 물론 공부엔 끝이 없어서 당장 정해둔 선에서만 하는 말이다.
6) 그러면서 취약한 알고리즘 분야들 문제를 풀어봐야겠다. 재귀/DP/그리디 정도일것같고 해당 분야 문제들을 티어를 가리고 선입견 없이 한문제한문제 오래 고민하면서 풀어봐야겠다.
길고 길었던 몇일간의 노력이 마무리를 지었다.
어쩌면 몇일이 아닌 백준을 처음 시작한 날부터 1년 이상의 시간을 노력해왔다고 말해야 할지도 모르겠다.
1년 이상을 매일 백준만 한건 아니라 티어상승이 빠른편은 아니었지만 정말 오랜 기간 꾸준히 잘 해왔구나 싶다.
오늘은 쉬자.