jwvg0425   3년 전

공부에 왕도란 없는 법이고 사람마다 적합한 공부 방식은 물론 다 다른 법이겠지만, 그래도 혹시나 다른 분들의 경험으로부터 좋은 인사이트를 얻을 수 있지 않을까 싶어 글을 써 봅니다.


 저는 코드포스 블루 상위~ 퍼플 하위 정도를 왔다갔다하는 중인데요, 보통 div1 A는 푸는데 div1 B는 풀때 반, 못 풀 때 반 정도인 것 같고 div1 C부터는 거의 손을 못 대는 정도입니다(5문제 기준). 

 직장인이라 따로 공부에 시간을 쏟을 여력이 부족해서 보통 그냥 꾸준히라도 풀자 생각하고 비교적 적은 시간을 써도 풀 수 있는 정도의 난이도를 매일 1~2문제 정도씩 풀고 대회만 가능한 한 참가하는 정도로 공부를 해오고 있었는데요, 계속 이런식으로 했다가는 레이팅을 올리긴 힘들겠다 싶은 생각이 들어 요즘 다른 공부 방식들을 고민해보고 있습니다.

 생각해본 방식들 중에는 이런 것들이 있는데요,

 1. USACO 골드정도 난이도의 문제들을 골라서 풀기. 쉬운 문제를 많이 풀기보다는 스스로 풀기 어렵다 싶은 수준의 문제를 조금씩이라도 풀기. 

 2. 앳코더 ARC 문제들 하나씩 순서대로 풀기

 3. 코드포스 div1 virtual 참가 매주 한 번씩 하기. 끝나고 도저히 못 풀겠는 문제는 에디토리얼 보고 구현해보기

 4. 백준에서 비슷한~상위 실력대 사람(블루~오렌지)이 푼 문제 목록 보고 그 사람은 풀었는데 나는 안 푼 문제들 골라서 풀어보기

 5. 1,2,3,4를 적당히 하다가 내가 모르는 지식이 나오면 그거 공부해보기, 공부해보고 백준에서 유사한 알고리즘 쓰는 문제 1,2개 정도 골라서 풀어보기


 고급 알고리즘에 관한 지식적인 문제는 둘째 치고서라도, 지식적으로는 알고 있는 범위의 문제지만 발상력, 구현력이 부족해서 못 푸는 경우가 굉장히 많은 것 같아 이런 식으로 생각을 했는데요, 혹시 다른 분들은 퍼플에서 헤매다 오렌지~레드로 올라가실 때 어떤 고민을 하셨고 무슨 공부가 많이 도움이 되었는지 말씀해주시면 정말 감사하겠습니다. 주변에 PS하는 사람이 한 명도 없고 혼자 꾸역꾸역 공부하려니 너무 막연하네요 ㅠ 그냥 나는 이런저런 것들을 했을 때 실력이 많이 늘었던 것 같다~ 같은 정도의 말씀만 해주셔도 좋아요!

dotorya   3년 전

제가 오렌지~레드에 진입하려고 노력하던 때가 약 2년 정도 전이니, 그 때의 공부 방법을 기준으로 말씀드려 보겠습니다.

코포는 여러 PS 문제 사이트들 중에서도 되게 전형적인 문제가 많이 나오는 편이라고 생각합니다. (요새는 그나마 덜한것 같지만..)
특히 DP문제, 수학(경우의 수) 문제, 트리 문제, 쿼리 문제, segment tree/lazy propagation 위주의 문제들이 Div1 B~C에 쫘르륵 깔리는 편이에요.
그래서 이런 문제들을 많이 연습해 보는게 좋은데, 이런 문제들이 많이 있는 곳은 역시 코포 Div1 B~C입니다(..)
결국 코포 문제들을 많이 돌아보는게 가장 낫다는 결론이네요.

저는 이 시기에 Div2 A~E, Div1 A~C를 특정 범위 내에서 모두 풀어보는 식으로 공부했었습니다.
대략 문제마다 최대 1~2시간 정도 고민해 보고, 안풀리는 문제는 에디토리얼과 구글링을 통해서 풀이를 이해하고, 한번씩 코딩해보는 식으로 진행했습니다.
퍼플(2000 정도)->레드(2400~2500 정도)까지 이런 식으로 공부했는데, 기록을 보니 약 8~9개월 동안 코포 대회 60세트 정도를 순회했네요.
여기에 간간히 BOJ에서 DP 태그 달린 문제집을 풀거나, 쉬운 문제(= 푼사람수 순)들을 순서대로 마구잡이로 푼다거나 하는 식으로 코딩 정확도를 늘렸습니다.
(쉬운 문제들을 풀어봤던 것은 코딩 속도를 늘리는 데도 되게 많은 도움이 되었다고 생각합니다. 원래 목적과는 좀 어긋나지만, 대회 성적을 높이기 위해서는 결국 코딩 속도가 매우 중요하기 때문에, 높은 레이팅을 원하신다면 괜찮을 것 같습니다. Div1 AB를 2~30분만에 풀어버리는 건 Div1 ABC를 2시간 다 채워서 푼 것과 거의 비슷한 등수가 나옵니다.)

발상력, 구현력이 부족한 것 같다고 하셨는데, 제가 한 방식은 구현력 상승에는 확실히 도움이 되는것 같습니다.
모든 문제를 한번씩은 코딩해 보고 넘어가고, 비교적 쉬운(Div1 C 이하인) 문제들 위주로 풀다 보니, 단위시간당 코딩량이 늘어나고, 그러다 보면 구현력과 코딩 정확도가 눈에 띄게 상승하게 되는 것 같습니다.
발상력의 문제라는 건, Div1 B~쉬운 C 정도의 구간에서는 '보았던 패턴이냐 아니냐' 식으로 생각하시는게 더 도움될 수도 있습니다. 이 정도 수준에서는 나올 수 있는 모든 패턴을 다 익히고, 그걸 약간 응용/변형해서 다른 문제에 적용하는 방식도 꽤 잘 먹히는 편입니다.
(주의: 저는 이런 식으로 생각하고 공부를 진행했지만, 아닌 사람도 꽤 많습니다. 특히 이 방식은 앞으로 훨씬 어려운 문제들을 풀 때, 아이디어를 떠올리는 실력 연습에 별 도움이 안 된다고 생각합니다. 이 방식으로 진행하면 '비교적 쉬운' 문제들을 잘 풀게 된다.. 정도로 생각해주시면 될 것 같습니다. 반대로, 어려운 문제들을 정말 오랫동안(하루에서 일주일까지도) 고민하는 건 아이디어와 성질 탐색에 큰 장점이 있지만 쉬운 문제들을 빠르고 정확하게 푸는 데는 좋지 않다.. 이런 느낌입니다.)


위 방법이 퍼플~레드 초반 시기에 제가 취했던 공부 방법입니다. 아래는 말씀해 주신 다른 대안들에 대해 몇가지 적어보도록 하겠습니다.

1. USACO 골드 수준의 문제들은 코포 Div1 B+~D- 수준에 걸쳐 있는 문제들입니다. (요새 문제는 플레티넘이 신설되어 좀 더 쉬워진 감도 있습니다.)  다만, USACO는 고등학생 대회라는 특성상 IOI나 올림피아드 스타일의 문제들이 많고, 문자열이나 플로우 등 특정 알고리즘은 잘 출제되지 않습니다. 코포와는 느낌이 많이 다르다는 생각도 받습니다. (코포: 정형화된 구현 복잡한 문제들, USACO: 독특한, 정형화되어 있지 않으며, 문제의 성질을 잘 찾아내야 하는 문제들) 
이쪽도 되게 좋은 문제들이 많아서, 문제 푸는 재미는 확실히 보장될 것 같습니다. 이 문제들을 순회하는 것도 좋은 공부방법이라고 생각합니다.

2. 엣코더는 현재 나와있는 온라인 저지들 중 가장 깔끔하고 아름다운 문제 스타일이 출제된다고 생각합니다. ARC의 난이도는 꽤 폭이 크지만, ARC E-F는 코포 Div1 B~D 정도라고 생각합니다. 여기의 문제들도 USACO와 비슷하게 문제의 성질을 잘 찾아내야 하는 문제들이 많이 나오는 편이고, 여기에 수학 문제들이 자주 추가됩니다. 이런 문제들이 재밌으시다면, 아예 목표를 코포 레이팅에서 엣코더 레이팅으로 변경하시는 것도 괜찮을 것 같습니다. 역시 추천드리는 방법입니다.
다만, 옛날 문제들은 아직 beta 시절이라 좀 안좋은 문제들도 있는것 같으니, 영문 Description이 제공되는 문제부터 순회하시길 추천드립니다.

3. Div1 Virtual 참가는 대회 감각을 익히는데 많은 도움이 되는 것 같습니다. 다만, Virtual 이후에 못 푼 문제들은 (C 이하는) 모두 editorial을 보고 넘어가시는 게 좋을 것 같습니다. 저는 Virtual을 한번 돌리고, 못푼 문제들을 더 풀어보는 식으로 연습하고 있습니다. (지금도 계속 사용하는 방법입니다.)

4. 특정 사람이 푼 문제들을 모두 푸는 것은 그다지 추천드리지 않습니다. 우선 문제 취향 편향이 좀 심할 수 있고, 그 사람이 푼 문제들 중에는 안 좋은 문제들도 많이 섞여 있을 수 있습니다. 난이도도 되게 널뛰기가 심해서, Div1 B~C 수준에서는 좋은 방법은 아니라고 생각합니다. 적어도 Div1 C를 절반 이상 풀 수 있는 시점에서 다양한 문제들을 겪어보고 싶으실 때 하시는 걸 추천드립니다.

5. 100% 추천드립니다!

제 글이 조금이라도 도움이 되셨으면 좋겠습니다. 질문 있으면 추가로 달아주세요!

godmoon00   3년 전

우오앙.....정말 좋은 질문에 좋은 답변이에요...저도 한 3년 뒤에는 이런 고민을 했으면 좋겠네요 ╭( ・ㅂ・)و

jwvg0425   3년 전

@dotorya 좋은 답변 정말 감사드립니다!! 엄청 많은 도움이 되었어요.

답변 글을 읽고 나서 몇 가지 추가적으로 궁금한 점이 생겨 질문드려봅니다.

1. 제 실력 수준에서, 코포 virtual 참가는 div1,2가 다 있는 대회의 경우 1을 참가해서 A,B,C를 풀어보는 게 좋을까요, 아니면 2에 참가해서 문제를 전부 푸는걸 목표로 해서 푸는게 좋을까요?


2. 아직 저한테는 한참 먼 일이긴 하지만 레드 초반 이후, Div1 C,D,E이상의 어려운 문제들을 풀기 위해선 어떤 공부들을 주로 하셨는지 궁금합니다. 

dotorya   3년 전

1. 저는 Div2만 있으면 Div2, Div1이 있으면 Div1으로 연습했었습니다.

사실 Div2 A, B는 한번 퍼플에 들어오셨다면 대부분은 정말 빨리 풀 수 있는 문제들이라서, 연습 효과가 좋지는 않습니다.

그저 대회 하나가 초록색으로 색칠되는 맛에 풀었던 것 같네요 ㅋㅋ


2. Div1 C 이후에는 코포에서 얻을 게 많이 줄어드는 것 같습니다.

Div1 D부터는 대회 출제자가 어려운 아이디어나 기상천외한 자료구조, 그 외 온갖 말도 안되는 알고리즘들을 들고오는 경우가 많아지는데, 이런 것들은 상당수가 한번 보고 말 문제들이기도 하고, 좋은 문제가 많지 않습니다. 특히, 출제자가 옐로우 이하 수준이라면 그 대회의 Div1 D~E는 C 수준이거나, 아니면 말도 안되는 억지 수준인 경우가 많습니다.

그래서 저는 이 때부터는 해외의 리져널 문제들을 모두 잡고 풀어본다거나, (대부분 Div1 D 이상의 문제가 2~3개 정도는 있습니다.) USACO 골드 문제들을 쭉 풀어본다거나, BOJ 랭작을 한다거나, BOJ 1페이지부터 쭉 순회한다거나 하는 식으로 연습했습니다. (마지막은 추천드리지는 않습니다 ㅋㅋㅋ) 사실 Div1 D 이상의 문제는 코포 대회 시간 내에 풀수 있다면 세계 수준의 실력이기 때문에, 이 시점부터는 문제를 가리지 않고 연습했던 것 같습니다. 지금까지도 이런 식으로 계속 연습하고 있고요.

다만, 이 방법이 정말 어려운 (코포 Div1 E 이상이나 리져널 마지막 문제 수준) 문제들에서 한계가 좀 있어서, 요새는 매우 어려운 문제를 잡고 푸는 것도 간간히 연습하고 있습니다. (풀릴때까지 시간제한 없이) BOJ에서 한명만 푼 문제라거나 어려운 리져널 올솔브를 시도해보는 식입니다. 더 어려운 문제를 어떻게 잘 풀 수 있을지는 저도 지금 고민중이라서, 이런 식으로 연습하는게 최선인지는 잘 모르겠네요..

댓글을 작성하려면 로그인해야 합니다.