요즘 ps 공부하는 방법 포스팅하는 게 유행인 것 같더라구요. 그래서 저도 빠르게 탑승합니다 하하하하하하
관련글
subinium: PS를 공부하는 방법 (How to study Problem Solving?)
koosaga: 내가 문제풀이를 연습하는 방법
baactree: 알고리즘 공부, 어떻게 해아하나요?
들어가기 전에
제가 이 포스팅에서 다룰 내용은 Problem Solving(이하 PS)을 공부하는 방법이며, 나아가서는 Competitive Programming(이하 CP) 즉 경시 대회를 공부하는 방법이고, 정확하게는 욱제가 대회를 준비하는 방법에 대해 다룹니다.
이 글이 코딩테스트에 도움이 되는가? 하면 잘 모르겠습니다. 코딩테스트는 literally 코딩 능력을 평가하는 시험입니다. 알고리즘 시험이 전혀 아닙니다.
조언하는 글인가? 하면 아마 그렇습니다. 제가 공부하는 방법을 기술하긴 할 건데 조언도 좀 할 겁니다. 뉴비를 대상으로 하는 조언이 될 것 같습니다.
다시 한 번 얘기하지만 철저히 ICPC와 같은 알고리즘 대회를 준비하는 관점에서 작성하는 글입니다.
그럼 욱제는 누군가? 하면 여기에 개략적으로 나와 있습니다.
한없이 모자란 초보의 견해이니 고수 분들은 넘어가 주세용~^^
나는 얼마나 못했었는가
저는 중학교 2학년 말에 학원에서 C언어를 처음 배우고, 학원에서 알고리즘을 배우면서 입문했습니다. 대회를 준비하는 관점에서 그다지 실력 향상에 도움을 주는 학원은 아니었기에 고등학교 3년 내내 개못했습니다. 고1 때 교내알고리즘대회 나가서 얼굴 빨개지면서 문제 풀다가 대회 말아먹고 터덜터덜 집 가던 기억도 있네요 하하하하
저에겐 수상이라는 목적만 있었습니다. 좋은 멘토도, 가이드도 없었기에 열정이 있어도 그다지 실력이 늘지 않았습니다. 그러면서 열정도 식고 불타고 식고 불타고를 반복했던 것 같네요.
고2인가? 학교에 정올반이 안정적으로 자리 잡고 좋은 선생님을 만났는데, 그때부터 좀 공부하기 시작했습니다. 그때 좋은 강사님도 만나서 많은 것들을 배웠습니다. 그래도 여전히 대학교 들어오고 나서도 그다지 열심히 하지는 않았고, 최근에서야 불타고 있습니다.
햇수로만 따지면 알고리즘 6년차라고 할 수 있겠네요. (근데 왜 개못하지?)
그래서 저는 보고 들은 건 많지만 오염되지는 못한, 고인청정수라고 할 수 있겠습니다.
문제를 얼마나 푸는가
반년 가까이 문제를 거의 안 푼 적도 있고, 매일 30문제씩 푼 적도 있고, 어제는 10문제 풀었어요. 맘대로 풉니다.
같은 기간에 똑같은 양을 푼다고 할 때, 한 번에 많이 푸는 것보단 꾸준히 매일(또는 매일에 가까운 짧은 주기로) 푸는 게 좋은 것 같아요. 여러가지 이유가 있는데, 코딩 오래 쉬면 감 떨어져서 감 찾는데 시간이 좀 걸리더라구요.
아무 문제나 많이 푼다고 무조건 잘해지는 건 아닙니다.
어떤 문제를 푸는가
최근에는 앳코더 문제(500~700점)를 좀 풀었고, 요즘에는 USACO Gold 문제들을 풀고 있습니다. 저 정도 난이도가 저에게 적당히 챌린징하고, 뭔가 공부되는 느낌이 드는 (?) 뭐 그렇더라구요.
옛날에는 정말 아무 문제나 풀었었는데 (정확히 아무 문제는 아니고 뭔가 주제나 그런 것들이 있었지만 별로 의미는 없습니다) 진짜 시간 낭비에요 당장 때려치세요
저는 맨날 제자리 걸음 하다가, 앞에 이야기했던 좋은 강사님을 만나 좋은 문제들을 풀면서 정말 많이 늘었어요.
꼭 좋은 멘토나 가이드를 붙잡고 공부하세요.
제발…
풀이를 보는가
저는 풀이 보는 걸 정말 좋아합니다. 왜 풀이를 안 보나요?
저는 대충 3분 정도 생각하다가 맞는 것 같은 풀이가 떠오르거나, 문제 읽고 “ㅅㅂ이게 뭐지” 싶으면 바로 풀이를 보기도 합니다. 풀이는 아는데 구현을 못 하겠어도 바로 봅니다. 30분 정도 고민하다가 모르겠으면 풀이를 보기도 합니다. 하루종일 고민하다가 모르겠으면 풀이를 보기도 합니다. 최대 한 달동안 고민한 경험도 있습니다.
근데 이제 막 배우는 단계에서는 1시간 이상 고민하지 마세요. 저는 지금도 오랫동안 고민 안 합니다. 아마 앞으로도 거의 안 할 것 같아요.
이유는 아래에
풀이를 보는 것은 어떤 장점이 있는가
- 실력 향상에 그다지 도움이 되지 않는 시행착오를 줄여 줍니다.
- 수많은 고민과 노력이 맺힌 열매를 단 몇 초만에 수확할 수 있습니다.
- 본인의 풀이보다 더 발전된 풀이, 혹은 또 다른 사고방식을 경험할 수 있습니다.
남들 다 알고, 이미 잘 알려진 어떤 방법들을 내가 5조5억년 고민해서 풀면 어떤 의미가 있나요? 성취감? 만족도? 실력의 향상?
단순히 문제 푸는 게 좋다면 풀이를 보는 게 그다지 좋은 방법이 아닐 수 있습니다. 그러나 대회를 준비하는 입장에서의 실력의 향상이란 무엇인가요?
재미와 성취감과 만족도를 얻고 싶나요? 일단 기본적인 걸 알고, 실력이 어느정도가 되면, 정말 재밌고 신박한 문제들이 차고 넘치고 터지게 많이 있습니다. 어떤 이유에서든, 하나라도 더 많이, 더 빨리 아는 것, typical한 것들은 빠르게 습득하고 넘어갈 필요가 있습니다. (다들 아시겠지만 당연히 풀이 보고 베끼고 끝내라는 뜻은 아닙니다)
새로운 것들의 등장이 점점 빨라지는, 고수들이 빠지는 속도보다 쌓이는 속도가 더 빠른 지금, 무지한 객기는 도태를 의미합니다.
그럼에도 불구하고 typical한, well-known인 남들은 이미 다 아는 것들을 끙끙거리고 고민하면서 대회를 준비하시겠다면 어… 혹시 수능 공부할 때도 그러셨나요?
문제를 풀기 싫을 땐 어떻게 하는가
안 합니다.
하기 싫은데 어떻게 해요?
즐기면서 공부하는가
어…
즐기는지는 모르겠고 그냥 올림픽에 도전하는 느낌이라고 하면 될까요
학점에 크게 관심도 없고, 딱히 취미도 여자친구도 없어서 시간 있으면 유튜브 보거나 sns 하거나 문제 풀거나 술 먹거나 (술 먹으면서 풀거나(??)) 합니다
실력을 올리려면 어떻게 공부해야 하는가
백날 쉬운 문제 풀고 랭작(랭킹작업, 아무 문제나 많이 풀어서 BOJ 랭킹 올리는 행위)해봤자 실력 올리는 것에 전혀 도움되지 않습니다.
랭작하면 문제를 많이 푸니까 코딩 능력이 늘지 않느냐? 네 늘지 않습니다.
문제를 많이 풀면 좋겠지만, 그렇다고 쓸데없는 문제를 많이 푸는 건 그다지 도움이 되지 않습니다. 내 실력에서 적당히 어렵게 풀 수 있는, 또는 적당히 풀 수 없는 정도의 문제들을 풀어보는 것이 가장 도움이 된다고 생각합니다.
본인이 어떤 문제들을 풀어야 할지는 my love 구사과님의 포스팅를 참고해 주세요
아 그리고 제발 영어 문제라고 이해가 안 되네 어쩌네 졸렬한 핑계 대면서 안 풀고 그러지 마세요… 초등학생 아니잖아요?
공부는 혼자 하는 것
모여서 스터디하고 강의 듣고 어쩌고…
공부는 혼자 하는 겁니다. 백날 떠들고 남이 말하는 거 듣고 앉아 있으면 문제를 풀 수 있나요? 대회 나가면 내가 풀이 떠올리고 내가 구현해서 내가 제출해야 합니다.
강의와 스터디에 의존하지 마세요.
혼자 공부하는 것 외의 모든 것들은 비타민 보조제 그 이상도 이하도 아닙니다.
(아 참고로 저는 강의와 스터디에 굉장히 우호적입니다. 강의를 들고 뭘 알아야 풀이를 떠올리든 할 수 있을 거고, 내가 푼 것들은 스터디에서 토론하면서 공유하면 실력이 더더욱 빨리 늘어요.)
내가 무지하다는 사실을 광고하세요
아주 대단히 많은 사람들이 내가 무언가를 모른다는 사실을 알리길 두려워 합니다. 대체 왜 그런가요? 누가 그거 모른다고 놀리나요? 아니면 깔보나요? 이 나이에??
사람들은 생각보다 친절합니다. 대부분의 사람들은 여러분의 질문에 친절히 답해 줍니다.
사람들은 생각보다 무지합니다. 당신이 무언가를 모른다는 사실을 모릅니다.
모르면 질문하세요. 제발
모르는 건 잘못도 부끄럼도 아닙니다. 모르면서 가만히 있다가 대회 나가서 털리는 게 잘못된 겁니다.
잘하는 사람들 보면 좌절감이 들어요
그 잘하는 사람들이 그곳에 오르기 위해서 얼마나 많은 시간과 노력을 투자했을 것 같나요?
그 대단한 사람들은 여러분들이 절망하는 그 순간에도 더 올라가고 있습니다.
노력의 결실을 부러워 하지 마세요.
누구나 하면 됩니다.
아 근데 문제 풀다가 천재들 보면 가끔 좀 짜증나긴 함
슬랙으로 오세요!
국내 알고리즘 고수들이 모두 다 모여있는 모여서 shitpost 하는 슬랙(채팅방)이 있습니다!
링크는 여기
적절한 멘토가 없다면, 혹은 있더라도 슬랙에 오세요.
좋은 커뮤니티(?)에서 고수들이 떠드는 걸 눈팅만 해도 얻어가는 것들이 많습니다.
마치며
모두 파이팅이에요
쓰고 보니 Souless Probelm Solving Machine을 양성하는 글이라고 비판하는 사람들이 있을 것 같은데 어… 뭐 그렇게 생각할 수도 있죠
(본심) 과외도 하고 있으니 좋은 멘토가 없다면 여기를 확인해 주세요 하하하하
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, C, C++, 씨, 씨쁠쁠, JAVA, algorithm, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이, 내가 알고리즘을 공부하는 방법, 알고리즘 공부하는 법, 코딩테스트, 코딩테스트 준비하는 법, 코딩테스트 공부하는 법, 알고리즘 공부, 코딩테스트 공부, 코딩테스트 학원