본문 바로가기

일상/잡담

알고리즘을 잘하고 싶어요!

들어가기 전에

 

타 과고생 분께 '알고리즘을 어떻게 공부해야 하는지'에 관한 질문을 받았습니다.

맥락상 알고리즘보다는 PS(Problem Solving)에 관심이 있으신 것 같지만, 자세한 이야기는 뒤에서 하도록 하겠습니다.

사실 예전부터 쓰고 싶었던 주제이기도 하고, 답변을 드리기에는 말이 길어질 것 같아서 이렇게 글을 쓰는 것으로 답변을 대신하려 합니다.

제가 경험하고 느낀 것을 토대로 작성하는 글이니 참고하는 정도로만 가볍게 읽어주세요. ㅎㅎ

 

 

· 이 글은 알고리즘을 어떻게 공부해야 할지 몰라 고민하는 분들을 위한 글입니다. 주변에 조력자나 동아리 등이 있는 분들에게는 해당 사항이 없을 수 있다는 점 참고해주세요.

 

· 필자의 생각과 발언은 무책임하거나 틀릴 수 있습니다. 글에 관한 피드백이나 질문은 항상 환영합니다!

 


저는 이랬어요

 

저와 상황이 비슷한 분들에게 이 글이 도움이 되었으면 하는 마음에, 먼저 저에 대해 얘기해보려 합니다.

 

저는 중1, 어쩌면 초등학생 때부터 영재고 대비를 했지만 경곽 3차에서 떨어진 후 경기북과고에 진학했습니다. (글을 쓰는 시점에 2학년입니다) 영재고 대비를 열심히 해서 어느 정도 선행지식이 있었던 터라 내신은 그리 열심히 하지 않았고, 북과고에 들어와서 접하게 된 알고리즘에 흥미를 붙여 여기에 엄청난 시간을 쏟았습니다. 특히 방학 때는 시간이 넘쳐서 하루 종일 코딩만 했던 것 같네요.

 

하지만 어떻게 공부해야 할지를 몰라서 높은 효율을 내지는 못했습니다. 지금 생각해보면 이쪽 분야를 진심으로 공부할 생각이 없어서 실력을 키울 필요도 못 느꼈던 것 같습니다.

 

1학년 때는 백준에 거의 손을 대지 않고 코드업 문제만 엄청 풀었던 기억이 납니다. 코드업에 친숙하신 분들이라면 아시겠지만, 코드업에 있는 문제들은 난이도가 그리 높지 않고 특별한 알고리즘이 잘 쓰이지 않는 구현, 아이디어 문제가 대부분입니다. 거의 5, 6개월 동안 대략 900문제 정도를 풀어제꼈지만, 제 실력은 거의 바닥이었습니다. 구현만 겨우 할 수 있는 정도, 딱 그 수준이었습니다. 이제 와서 후회하기는 늦었지만 아마 이때부터 공부를 시작했더라면 어땠을까 하는 아쉬움이 있습니다.

 

(정확히 언제였는지는 기억이 안 나지만) 2학기가 거의 끝나갈 무렵에 우연한 계기로 PS 커뮤니티를 접하게 됩니다. 아마 친구가 보여줬던 것 같습니다. '알고리즘 빡공방'이라는 오픈 채팅에 참여하였는데, 제 기억에는 중국의 뇌절 자료구조(아마 탑트리)에 관한 이야기가 오가고 있었습니다. 톡방에 있으면서 백준이 코드업보다 더 메이저하고 문제의 질이 높다는 것을 깨달을 수 있었고, 이후 갈아탄 백준에서는 제 실력이 한참 부족하다는 걸 뼈저리게 느꼈습니다.

 

백준에서 티어를 높이거나 티어가 높은 문제를 풀려면 '새로운 알고리즘'을 배울 수밖에 없었고, 저는 이때부터 무작정 알고리즘을 배우기 시작했습니다. 솔브닥의 태그에 들어가서 모르는 알고리즘이 있으면 검색해서 배우고, 문제 풀고를 반복했습니다. 물론 이것도 별로 효율적인 공부 방법은 아니었습니다. 알고리즘의 난이도를 알 길이 없으니 시간만 쏟다가 포기하는 경우도 종종 있었고, 그나마 이해가 잘 되고 문제의 난이도도 높은 수학 쪽으로 공부 비중이 쏠리는 일도 일어났습니다.

 

그렇게 방황하던 중에 한 블로그를 발견하였는데, 순서도 착착 정리되어 있고 설명도 꼼꼼하게 해주시는 것이 공부하기 정말 편했습니다. 대회 알고리즘 카테고리에 들어가서 처음부터 끝까지 차례대로 완독하면 알고리즘 공부가 사실상 거의 끝납니다. 저는 겨울방학에 하루에 글 한두 개 정도를 읽고 딸린 문제를 풀어보는 것을 목표로 공부했습니다.

 

여기까지 왔다면 본인이 무엇이 부족하고 무엇을 모르는지 정도는 알 수 있으니 그에 맞춰서 공부하면 됩니다.

 

제 개인적인 이야기가 쓸데없이 길어진 것 같네요... 하하

이제 제가 최선이라고 생각하는 공부법(?)을 알려드리겠습니다.

 


알고리즘을 위한 공부

 

사실 위의 단락에서 하고 싶은 말을 다 했습니다. 간단히 정리해드릴게요.

 

가장 중요한 것은 체계적이고 효율적으로 공부하는 것입니다!

타 OJ 관리자분들께는 죄송한 말이지만 우리나라 최고의 온라인 저지는 백준입니다. 백준을 메인으로 풀며, 타 OJ는 심심할 때 들어가는 것을 추천합니다. (CodeUp에서 어느 정도 높은 위치에 있는 제가 이런 말을 해도 되나 싶기도 하고...) 알고리즘 공부 추천 경로는 다음과 같습니다.

 

Ries 마법의 슈퍼마리오 : 앞에서 언급한 블로그입니다. '대회 알고리즘' 카테고리의 모든 글을 완독한다는 생각으로 공부하시면 될 것 같습니다. 알고리즘 편식하지 마세요!

백준 단계별로 풀어보기 : 뒤로 갈수록 급발진하긴 하는데, 전부 풀어볼 가치가 있는 문제들입니다. 라이님 블로그에서 빠르게 지나간 부분들을 보강한다는 느낌으로 풀면 됩니다.

solved.ac : 백준의 하위 사이트입니다. 'Class'가 비슷한 맥락으로 풀어볼 만합니다. '태그'에서 원하는 알고리즘을 골라 연습할 수 있습니다. 이게 또 티어 올리는 맛이 있긴 한데... 너무 연연하지 않았으면 좋겠습니다.

Others : 구글 신은 모든 것을 알고 있습니다..  항상 구글링하는 습관을 들입시다. 구글링하다 보면 정말 많은 PS 블로거들을 만날 수 있는데, 이들의 블로그를 둘러보는 것도 나쁘지 않습니다. 시간이 순삭되는 경험을 할 수 있지만 그 시간에 게임을 하는 것보다야 유익하니까요! ㅎㅎ

 

 

물론 소통도 중요합니다!

저는 커뮤니티가 정말 좋다고 생각합니다. 제가 어디 가서 말을 많이 하지는 않지만, 옵챗이나 디코에서 고인물들이 하는 얘기만 듣고 있어도 실력이 절로 올라가는 기분이 듭니다. 실제로 다른 사람들이 공부를 어떻게 하는지, 이 알고리즘이 어떻게 사용될 수 있는지 등의 다양한 팁을 얻을 수 있습니다. 그리고 알고리즘이 생각보다 어려운 분야라서 혼자 공부하다 보면 벽에 막힐 때가 종종 있습니다. 이때 (예의를 지켜서) 질문을 하면 정말 감사하게도 고인물 분들이 친절하게 답변해주십니다. 물론 과도한 질문은 삼갑시다! 혼자 고민을 해서 해결될 문제라면 별로 답변해주고 싶지 않습니다.

 

카톡 채팅방 : 키워드 몇 개 검색하면 찾을 수 있습니다. 분위기를 읽거나 정보를 얻고, 질답이 가능합니다.

지구이의 프로그래밍 스터디 그룹 : 지구이님이 만드신 디코방입니다. 핵굇수분들이 서식하고 있습니다.

 

 

나머지 세부적인 부분은 본인이 채워 넣을 수 있을거라 믿습니다.

 

여기까지는 '알고리즘 공부법'이었습니다.

??? : ?? 'PS 공부법'과 다른가요?

저는 다르다고 생각합니다.

PS를 즐기기 위해서는 알고리즘을 알아야 하지만, 알고리즘을 많이 안다고 해서 PS를 잘하지는 않습니다.

 


PS를 위한 공부

 

PS는 Problem Solving, 즉 '알고리즘을 이용해 문제를 해결하는 것'을 말합니다.

문제를 보고 어떤 알고리즘이 필요할지, 구현은 어떻게 할지 판단하는 것이 상당히 중요하게 작용합니다.

 

PS 공부 방법에 대한 자세한 설명은 이 글로 대신하겠습니다. 제가 하고 싶은 말을 그대로 해주셔서 따로 쓰는 게 큰 의미가 없을 것 같네요.

제가 하고 싶었던 말만 간단히 추려보자면 "본인 실력에 맞는 난이도의 문제를 최대한 많이 접하고 고민해보자" 정도가 될 것 같습니다.

 

아, 그리고 PS를 하다 보면 필연적으로 '재능충'들을 만나게 됩니다. 이 친구들을 신경 쓰기 시작하면 본인만 힘들어진다는 것을 잘 아실 거라 믿습니다. (대표적으로 경곽과 설곽이 있습니다)

 


CP를 위한 공부

 

CP는 Competitive Programming, 즉 프로그래밍으로 경쟁하는 것을 말합니다.

PS와 CP의 차이에 대해서는 이 글을 읽어보시면 좋을 것 같습니다.

CP에 있어서 가장 중요한 것은 '얼마나 빠르게 문제를 해결할 수 있는지'입니다.

 

윗글에서도 알 수 있지만, CP는 필수적이지 않습니다...! 대입을 준비하는 학생들이 KMO 공부를 하지 않는 것과 비슷한 맥락일 것입니다. 하지만 PS를 좋아하고 경쟁을 즐기는 저 같은 사람들에게는 매력적인 분야가 아닐 수 없습니다. 그래서 이런 분들을 위해 간단한 팁을 드리고자 합니다.

 

Online Contest가 열리는 사이트는 여러 곳이 있지만, 가장 유명하고 많은 사람이 참가하는 사이트는 Codeforces 입니다. Div 1~3이 비정기적으로 열리며 문제들이 마냥 쉽지는 않습니다. 쓰이는 알고리즘의 수준이 그렇게 높지는 않아도 어려운 아이디어를 요구하는 문제들이 출제됩니다. 처음에 참가하면 한 두 문제 푸는 것도 쉽지 않아 좌절할 수 있지만, 꾸준히 대회에 참가하고 버추얼을 돌며 연습하면 어느 정도 성과를 얻을 수 있습니다. 노력을 해서 못 갈 티어는 없다고 듣긴 들었습니다...만 개인적으로는 블루만 가도 CP에 소질이 있다고 생각합니다.

 

제 팁은 별거 없습니다. 매 라운드에 꾸준히 참가하여 무언가를 얻어가기만 하면 됩니다.

우선, 라운드에 참가하여 2시간 동안 문제를 고민하는 것만으로도 실력이 상승합니다. 저는 대회가 끝나면 이번 라운드를 돌아보며 대회 중에 해서는 안 됐던 발상, 코딩 미스 등을 점검합니다. 그리고 다음 라운드에서 이를 기억하며 실수를 줄여나간다면 적어도 스트레스는 덜 받을 수 있습니다. 또, 대회 종료 후 에디토리얼과 다른 사람들의 코드를 보며 다양한 접근과 발상, 코딩 방법을 배웁니다. 저는 한동안 블루를 탈출하지 못해서 마음 고생을 했었는데, 생각을 비우고 실수를 줄이는 것에만 집중하니 원하는 점수가 나온 것 같습니다.

 


마치며

 

하고 싶었던 말은 어느 정도 다 한 것 같습니다. 다만, 저에게 질문해주신 분께는 조금 과한 글인 것 같아 죄송하게 생각하고 있습니다.

제가 알고리즘을 독학하는 과정에서 깨닫고 느꼈던 것들을 다른 분들에게 전할 수 있어 행복했고, 저처럼 미련하게 공부하는 사람이 없었으면 하는 마음이 잘 전해졌으면 합니다. 긴 글 읽어주셔서 감사합니다.

 

 

'일상 > 잡담' 카테고리의 다른 글

누적 방문수 10,000  (0) 2021.12.20
넥슨 특별 세트  (4) 2021.08.20
마우스를 바꿨다  (0) 2021.08.06
음!  (2) 2021.07.24
21.07.13  (4) 2021.07.13