32개의 댓글이 있습니다.
-
-
Taeyoon_Lee -
음? 탑코더 레드 찍으면 자동으로 어드민 되는 거 아닌가요?
12년 전 link
-
-
-
Apple_Cplus -
와 잘읽었습니다!! 정말 많이 힘이나게하는 글이에요 ㅋㅋ
12년 전 link
-
-
-
WeissBlume -
와 정말 좋은 글 감사합니다 ㅎㅎ 힘이 나요!!
그리고 깨알같은 링크들 ㅋㅋ재밌어요
12년 전 link
-
-
-
Signin -
좋은 글 감사합니다~!
VOCList님 혹시 메일 주소를 주실 수 있을까요~?
개인적으로 여쭈어보고 싶은 것이 있어서요....
가능하시다면 부탁드리겠습니다 ㅎㅎ혹시 메일은 주실 수 있는데, 이 공개적인 장소에서
메일 주소를 알려주시기 어려우시면 freeformate@naver.com
으로 메일 한통만이라도 부탁드릴게요~!
11년 전 link
-
-
-
VOCList -
아니면 tae@yutar.net 으로 메일주시면 답장드릴게요!
11년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
VOCList
안녕하세요. 통일된 닉네임 하나 없는 VOCList입니다.
현재 TopCoder 에서는 xhae로 활동하고 있으며, 몇 달 전부터 좋은 기회가 생겨 재학중인 학교에서 ICPC 준비 동아리의 고문 비슷한 역할을 하고 있습니다.
어제 밤 다가오는 18일에 있을 동아리 연합 대회 팀을 구성하던 도중 한 동아리 멤버분께서 가지신 고민거리를 공유 할 기회가 있었습니다. 그런데 이야기를 쭉 듣다보니 제가 몇 년 전에 생각했던 고민거리과 상당 부분이 겹치더라고요.
아마 대회 준비를 하시다 보면, 특히 시작한지 얼마 안되시는 분들은 다들 공통적으로 궁금해하는 사항들이 있을 것 같습니다. 그래서 몇몇 고민사항들에 대해서 어떻게 생각하는지 제 생각을 툴툴 털어놓는 글을 써 볼까 해요. 지극히 개인적인 생각들이지만 처음 준비하시는, 또는 같은 고민을 가지신 분들께 조금이나마 도움이 되었으면 좋겠습니다. 물론 고수분들도 좋은 의견 많이 내주시리라 믿습니다! :)
1. 대회 준비는 어떻게 시작해야 해요? 딱 정리된 교재같은거 없나요?
먼저 교재 몇 개를 추천해볼게요. 의도치 않게 특정 서적 광고가 될거같긴 한데...
Programming Challenges: 이 책도 벌써 고전 중 고전이 되었네요. 이 바닥에서 쓰이는 문제를 제법 광범위하고 체계적으로 실은 책으로, 알고리즘보다 문제 해결이 좀 더 중심이라는 점에서 이 정도 규모는 거의 세계 최초의 책이 아니었나 생각합니다. 국내 번역본이 나와있는 상태며, 번역본은 무려 책에 실린 전 문제에 대한 해답 코드를 부록으로 제공하고 있습니다. 아마 이 해답코드의 일부는 알고스팟 멤버들도 작성에 참여했다고 알고 있습니다. 요즘 현역대회 문제들보다는 문제가 조금 쉬운감이 없잖아 있지만 기본을 다루는 책이기에 여전히 추천할만한 고전이라고 생각합니다.
프로그래밍 콘테스트 챌린징: 이 책은 비교적 최근에 나온 책입니다. 일본의 유명한 3 명의 PS(Problem Solving) 매니아이자 동경대 07학번 동기인 Mastoshi Kitagawa, Takuya Akiba, 그리고 Yoichi Iwata 가 공저한 책입니다. 국내에는 2011년에 번역본이 나왔는데, 솔직히 말씀드리자면 전 이 책을 본 적은 없어요. 역자분께는 죄송하지만 목차를 보면 번역 퀄리티도 번역에 사용된 어휘가 실제 우리가 PS판에서 쓰는 어휘와는 상당히 거리를 가진 경우가 종종 있고요. 하지만 저자들이 모두 세계대회에 쟁쟁하게 이름을 올렸던 사람들이고, 그 친구들이 존심(...)걸고 찍어 낸 책인 만큼, 그리고 목차에서 추측하건데 아마 Programming Challenges보다는 좀 더 난이도있는 문제들을 깊히 다루고 있을 것이라고 생각합니다. PS에 조금 익숙해지신 분들은 아마 번역 퀄리티와는 상관없이 책 내용을 흡수하실 수 있으실테니, PS에 조금 익숙해지시면 이 책도 제법 추천해볼만한 서적이라고 생각합니다.
JMBook: PS계의 궁극서적. 파라다이스. 유토피아. 꿈과 희망. 그런데 없어요... 제가 원고 좀 훔쳐봤는데 쩔어요. 나오기만 하면 그냥 이거 사시면 됨. 왜 나와야 살 수 있는지는 책 링크를 참고합시다. 제 생각에 2012년 안에 어떤 모양으로든 접하실 수 있을 것 같으니(JM님 보고있나!), 나오면 꼭 구해보세요. 링크에서 목차 보시면 아시겠지만 정말 PS계에서 다루는 대부분의 토픽에 대해서 모두 기재하고 있고, 챕터 하나하나 퀄리티가 그야말로 장인이 n년동안 숙성시킨 책이니 장맛이 아주 그냥... 심지어 한글 원저니 알아듣기도 제일 쉽습니다!
... 와 같은 책들이 있습니다. 문제 풀이와 대회 준비가 주가 되는 책에 대해서만 말씀드렸고 그 외에 CLRS라던가 Foundation To Algorithms와 같은 알고리즘 서적에 대한 설명은 다른 곳에서도 많이 찾아보실 수 있으니 생략할게요.
서적 이외에도 참고할 수 있는 자료는 많습니다. TopCoder에서 진행하는 모든 대회는 Competitions > Algorithm > Single Round Matches(SRM) > Statistics > Match Editorials 를 통해서 문제에 대한 해법을 확인할 수 있습니다. CodeForces같은 경우에도 보통 자체 운영하는 블로그 안에(CodeForces는 모든 가입자 계정에 블로그가 자동으로 생성됩니다.) 출제자가 Editorial을 올려놓기 때문에 잘 찾아보면 많은 경우 문제의 해법을 찾을 수 있습니다.
그런데 너무나 당연한 사실이긴 하지만, 가장 중요한 건 서적도 커리큘럼도 아닌 자기 자신과의 싸움인 것 같습니다. 책을 아무리 읽고 모 대학교 같은 경우에는 심지어 정규 과정에 PS와 관련된 수업이 있기도 하지만, 이러한 지식의 제공량이나 외부 활동량이 곧 실력으로 직결되는 것 같지는 않아요. 그보다는 작은 분량이더라도 천천히, 차근차근 주어지는 지식을 내 것으로 소화하고 넘어가는 의지가 돋보이는 사람이 결국 뛰어난 실력을 지니게 되는 것 같아요. 여기서 내 것으로 소화한다는 말은 먼저 문제를 읽고, 해법을 고안 / 찾아서 이해하고, 직접 코딩을 해서 정답판정을 받고, 자신보다 뛰어난 사람의 코드를(실행시간이 짧거나, 코드가 간결하거나 등) 이해해서 내 것으로 만드는 일련의 4가지 스텝을 모두 끝낸다는 것을 의미합니다. 많은 분들이(심지어 저도, 요즘도...) 착각하기 쉬운 것 중에 하나가 문제를 이해하고 해법을 찾아서 읽어보고 바로 다음 문제 / 알고리즘을 찾아서 넘어가는 일인데요. 직접 짜 보지 않은 지식은 절대로 내 지식이 될 수 없다는 것이 제, 그리고 많은 PS러들의 지론입니다. 많은 경우 내가 이해했다고 착각하고 넘어가기 쉽상이거든요. 적어도 공부를 하실 때 한 문제에 대해서 3번째 스텝까지도 진행하지 않고 넘어가는 것은 시간낭비가 될 가능성이 정말 높다고 생각합니다. 반면에 조금 더디고, 공부하는 양이 적어 보이더라도 꾸준히 Accept 판정을 받고 다른 사람의 코드를 참고하시다 보면 어느새 전에 알던 내가 아니게 되어 있을거라고 확신합니다!
2. 그래서 대회 준비는 어떻게 진행하는데요?
이 부분은 사실 ICPC가 아닌 다른 대회에서는 따로 챙길 부분이 없다 할 정도로 너무나 자명한 부분일 수도 있습니다. ICPC 외 다른 알고리즘 프로그래밍 대회 중 팀을 짜서 참가하는 대회는 거의 없다시피 하기 때문인데요. 개인전 대회를 준비한다는건 곧 문제를 풀거나, 좀 더 타이트하게 해도 끽해야 대회 규격과 맞추어 시간을 정하고 문제를 풀고, 복습 / 반성하고 다음으로 나아가는 정도가 전부인 것 같아요.
사실 팀전이라고 해도 기본 골자는 개인전 연습과 다르지 않습니다. 문제를 풀어서 기량을 올리고, 목표로 하는 대회의 진행 스케쥴에 맞추어 같은 시간에 시작하고 같은 시간에 끝내고 같은 점심시간을 가지고... 단 제 기억을 돌아보면 팀 연습의 가장 큰 문제점은 늘 복습에 있었던 것 같아요.
위 지문에서 문제점은 무엇일까요? 앞에서도 말씀드렸지만 연습 과정중 복습 과정을 찾아볼 수가 없어요. 물론 매일같이 연습 후에 술마시고 놀러 가는 건 아니겠지만, 제 경험상 기본적으로 대회 연습 후 복습이란건 연습이 진행되면 진행될수록 연습자에게, 가끔은 본 연습보다도 훨씬 큰 부담이 되었던 기억이 납니다. 기본적으로 대회 연습에 5시간, 팀원들을 만나기 위해서 어딘가에 모이고 연습 앞 뒤로 까먹는 시간이 2시간, 연습 종료 후 복기에 1시간. 이렇게만 잡아도 한 번 ICPC 셋을 팀 연습을 하기 위해서 투자하는 시간은 거언 8시간이나 됩니다. 정확히 사람이 가장 퇴근하고 싶어지는 시간이네요. 하지만 이 시점에서 내가 오늘 한 일이 무엇인지를 생각해보면, 복습을 하지 않고 / 소홀히 하고 넘어가는 것은 정말 시간대비 효율이 나쁜 연습 방법이란걸 알 수 있습니다. 우리 팀이 오늘 연습에서 총 7 문제를 해결하고, 3문제가 미해결문제로 남았습니다. 하지만 이 중에서 내가 한 일이란건 2 문제 정도를 해결했을거고, 해결하지 못한 3 문제를 읽어보고 어느 정도 고민해보긴 했을거고, 우리 팀이 해결한 다른 5 문제에 대한 문제설명과 해법을 복기 시간에 다른 팀원들에게 전달 받으셨을겁니다. 1번 항목에서 말씀드린 문제 해결의 4 스텝 기억나시나요? 해당 스텝에 비추어 보면 5개 문제에 대해서 2번 스텝까지는 끝내 놓았다는 거죠. 그런데 여기서 복습을 소홀히 하면, 날로 먹을 수 있... 까지는 아니어도 아무것도 모르는 상태에서 5문제를 해결하는 것보다는 훨씬 간단히 5문제에 대한 경험을 얻을 수 있는 찬스를 버리는 모양이 됩니다.
전 늘 그랬어요. 나중에, 다른 사람의 힘 / 해법을 빌리지 말고 '혼자' 풀어보자고. 그리고 굉장히 많은 문제를 결국 버려버린 것 같아요. 물론 저는 지금도 여전히 이 방법이 꽤 괜찮다고 생각하기는 합니다. 혼자서 정말 나중에 밀리지 않고 해결을 한다는 가정 아래에서요.
팀 구성원간 개인 역량 차이가 있기도 하고, 대회 연습 때 풀렸던 모든 문제를 혼자서 다시 한 번 모두 해결해 보는 일은 절대로 쉬운 일은 아닙니다. 하지만 복습을 하지 않는 것 만큼 투자한 시간과 비용을 안타깝게 소모하는 일 또한 없다고 생각해요. 팀 연습을 계획할 때 소홀히 하기 쉬운 복습, 이 복습에 대한 시간 안배와 각오가 필요하다는 사실을 숙지하시고, 복습이 끝났을 때 비로소 한 세트에 대한 연습이 끝났다고 생각하시는 것이 바람직하다고 생각합니다. 이건 저부터도 좀 잘 지켜보려고요. ^^;
3. 팀 내 역할 분담은 어떻게 하세요?
이건 정말 팀 마다마다 다양한 전략을 가지고 나오는 부분인 것 같아요. 팀 구성원들이 서로서로 잘하는 분야가 모두 다르고 장단점이 있을테니 보통 장단점을 잘 분석해서 팀에 유효한 전략을 세워 나오는 편인 것 같습니다. 물론 가장 흔한 패턴은 대회 시작 후 A, B, C 문제를 서로 나눠 가진 뒤 풀 수 있는 사람은 풀고 컴퓨터를 잡지 않은 사람들은 고민하거나 다른 읽지 않은 문제를 읽는 방식인 것 같은데, 몇가지 특이한 상황을 좀 살펴보자면
팀원 A가 영어를 여타 멤버보다 월등하게 잘 해요: 그리고 A는 문제해석 셔틀이 되었습니다... 물론 B, C가 A가 던져주는 문제를 척척척 풀 수 있어서 A가 문제 해석과 서포트에 집중할 수 있는 상황이어야겠죠?
팀원 A가 그래프(혹은 특정 분야) 덕후에요: 다른 팀원 2명이 그래프같은 문제는 일단 A에게 던져줍니다. 그런데 사실 어떤 문제가 특정 타입(그래프, DP 등)인지 판정해 내는 것도 실력이고 그걸 알려면 여타 팀원들도 해당 타입에 대한 전반적인 지식은 있어야 하기 때문에 개인적으로 이건 크게 의미가 있는 전략은 아닌 것 같아요. 더구나 요즘 세상은 살기 험난해서 그래프문젠데 코스트를 DP로 구해서 이걸 행렬변환을 해서 3차원 좌표에 찍고 3차원 컨벡스를 구해서 이걸 그래프로 치환...???????? 까지 시키면 정말 출제자가
존나나쁜사람이지만... 여튼 복합적인 알고리즘을 요구하는 문제가 예전보다 많아져서 다들 어느 정도는 숙지하시는 편이 좋을 것 같아요.팀원 A가 이번에는 코딩왕이 되겠대요: A가 각종 알고리즘 구현과 문제 입력 / 출력 처리에 능수능란하게 트레이닝되어있고, B와 C가 문제만 읽고 해법을 콕콕 찍어줄 수 있는 능력자 파티입니다. A 혼자 컴퓨터를 잡고 모든 문제를 다 코딩하고 B와 C는 옆에서 A에게 문제 설명 및 해법을 던져주는 역할을 맡게 됩니다.
위와 같이 특이한 전략을 선택하는 팀들도 있지만, 보통 3인이 고루고루 비슷한 역할을 맡는 것 같아요. 서로 문제 읽고 토론도 하고, 코딩도 돌아가면서 하고요. 우리 팀 내에 어떠한 인물이 정말 이런 점에 강점이 있다, 혹은 우리가 위와 같이 특이한 전략을 세워서 연습을 하면 다른 팀보다 분명 얻을 수 있는 강점이 있다! 고 생각되시는 분들은 우리 팀만의 전략을 세워보는 것도 재밌을 것 같습니다.
조금 다른 이야기기는 한데, 가능하면 코딩할 때 디버거는 쓰지 않는 편이 좋습니다. 정 디버깅이 필요한 상황이라면 printf와 같은 출력 수단을 통해서 필요한 자료를 한번에 찍어보면 찍어봤지, 한 스텝 한 스텝 값이 변하는 디버거는 정말 그 어떤 상황에서라도 팀에 가산점이 되기 힘듭니다. 더구나 우리나라 말고 해외 리저널중에서는 VS를 개발환경으로 선택한 리저널이 거의 전무한 상태고, gdb라도 써서 디버깅하려 하면 더욱 끔찍하죠. 평소에 문제를 푸실 때 부터 디버거를 쓰지 않고 문제를 풀어내는 습관을 들이시기를 강력하게 추천합니다. 익숙해지면 디버거를 쓰는 것 보다 문제를 푸는 시간도, 디버깅을 하는 시간도(출력디버깅) 훨씬 효율적으로 변해요. 이건 거의 확실해요 확실!
4. 실력은 부족하고 문제는 안풀리고 연습이 잘 되어 가고 있는지도 모르겠고 고구마 장사도 안되고 힘들어요.
이른바 슬럼프가 찾아왔다는 건데요. 실력에 대해서는 크게 걱정하실 필요가 없다고 생각합니다. 제가 경험상 확신할 수 있는 건, 여러분의 실력은 연습한 만큼 절대로 오르고 있으며, 제자리를 맴돌거나 더 못 풀게 되는(?) 일은 없으니 안심하셔도 된다는 거에요.
한 문제, 한 문제씩 풀어 나가는 PS 연습에서 사실 내 실력이 향상되고 있다는 걸 인지한다는 건 쉬운 일이 아닌 것 같아요. 특히 PS를 처음 배울 때에는 그래도 몰랐던 새로운 알고리즘을 배우고, 해당 알고리즘을 통해서 풀지 못했던 문제를 해결하는 성취감이 있는 것에 비해, 어느정도 PS에 필요한 알고리즘 조각들을 모두 모으고 나면 그 다음부터는 새로운 지식을 배우기보다는 알고 있는 지식을 조합 / 응용해서 문제를 풀어내는 일이 문제풀이의 대부분을 차지하게 됩니다. 새로운 지식을 커리큘럼에 따라서 배울 수 있는 기회가 없어진다는 것은 곧 그 만큼 눈에 띄이는 성취를 이룰만한 부분이 줄어들게 된다는 거고 하루에 많이 풀어봐야 열 문제를 넘기기 힘든 우리 상황을 되돌아 볼 때, 개인차는 있겠지만 누구나 다소 탈력감을 느끼는 시기가 있을 것이라고 생각합니다.
제 경우를 보자면, 예전에는 그래도 하루하루까진 아니어도 꾸준히 연습하다 보면 몇 달에 한 번씩은 스스로 놀랄 때가 있었어요. 예전엔 해결할 수 없었던 타입의 문제를 너무나 자연스럽게 해결할 수 있을 때, 내가 왜 / 언제부터 이런 형식의 문제를 풀 수 있었지? 하고 스스로 놀라면서 기쁜 마음에 연습에 박차를 가하곤 했습니다. 그런데 최근엔 그런, 마치 한 단계 실력이 점프한 듯 한 느낌을 받은 시기가 언제였는지 잘 기억도 나질 않네요.
하지만 꾸준히 연습한다면 실력은 나도 모르는 새에 올라가 있더라고요. 요즘 1년전에 연습했던 SRM을 다시 한 번 주행하는 중인데 당시에는 해결할 수 없었던 문제들이 이제는 제법 손에 잡히고, 1년 전 연습 성적과 지금 연습 성적을 비교해보면 대부분의 경우 현재 성적이 예전보다 월등하게 좋은 편입니다. 물론 예전엔 풀었는데 지금은 상위점수는 커녕 해결도 못하는 문제들도 가끔씩은 있어요... 그럴 땐 예전의 나는 천재였구나 엉엉함 ㅠㅠ
초기에는 어느정도 눈에 보이는 실력향상 / 성취감에서 피드백을 얻어 연습을 계속하는 것도 한 방법인 것 같아요. 하지만 연습량 X 실력 곡선을 그려보면 아마 로그형태 그래프가 아닐까... 피드백이 돌아오는 시간은 점점 느려지기 마련이고, 이는 굉장히 자연스러운 현상이라고 생각합니다. 내가 예전보다 연습을 잘 못하고 있는 것이 아닌지 의심하고 스트레스 받으실 필요는 전혀 없다고 봐요.
전 PS를 지속하는데 있어서 가장 중요한 것 중 하나는 재미와 스트레스의 로드밸런싱인 것 같아요. 이건 비단 PS 연습에만 해당되는 사실은 아닌 것 같기도 하고요. 실력향상을 위해서 어느정도의 강제되는 연습 / 할 것들은 필요합니다. 이쪽은 스트레스에요. 그럼 그 스트레스를 받으면서 우리가 계속 문제를 푸는 이유는 뭘까요? 예전부터 해 와서? 다른 문제푸는 친구들에게 뒤쳐지고 싶지 않아서? PS를 계속 하게 만들어주는 원동력은 사람 마다마다 다르겠지만, 저 같은 경우에는 결국 저 자신을 위해서, 저 자신의 재미를 위해서 문제를 풀 때가 가장 효율도 좋고 무엇보다 즐거웠던 것 같아요. 스트레스가 재미를 넘어서 연습 일정이 내게 큰 압박이 되고, 성적이 스트레스가 되어서 잘 안나올수록 화만 나고 그럴수록 성적은 나빠져만 가는 악순환... 이럴 때에는 과감하게 연습을 그만두고 다시 흥미가 생길 때까지, 내가 부담없이 연습을 즐길 수 있을 때까지 기다리는 것이 좋은 수라고 생각합니다. 그 러시아의 유명한 코더 Petr Mitrichev도 예전에 대회 준비자들을 위한 인터뷰에서 비슷한 말을 했었고요(물론 이 친구는 여자친구랑 나가서 놀랬지만 나쁜놈아 ㅠㅠ). 지금 돌아서서 보면 쉴때는 쉬고 집중할 때 정말 효과적으로 집중할 수 있었던 것이 그가 다년간 세계 부동의 1위 자리를 지킬 수 있었던 원동력 중 하나였던 것 같아요.
전 지금도 문제를 푸는 일이 즐겁습니다. 출제자와 참가자의 두뇌싸움같은 느낌이 들어요. 어려운 문제일수록 해결할 수 있는 형태로 변환했을때의 쾌감은 가히 다른 분야에서는 찾아보기 힘든 종류의 즐거움이 아닌가 싶습니다. 이런 즐거움을 지금보다 좀 더 많은 우리나라의 PS 대회 참가자들이 공유하고, 보다 즐거운 PS 생활에 도움이 되었으면 하는 마음에서 이 글을 올립니다.
노파심에 한 마디만 덧붙이자면, 본 글에서 언급한 제 의견들은 대부분이 제 경험을 바탕으로 한 이야기입니다. 개인적인 성향차에 의해서 다른 분들께는 얼마든지 적용되지 않는 부분이 있을수도 있어요. 그럴 일은 없겠지만 혹 본 글 내용이 신경쓰여 지금 독자분께서 확신하고 있었던 부분에 혼돈이 오신다면, 차분히 생각하시어 본인에게 맞는 길 / 방법을 찾아나가셨으면 좋겠습니다. 요는 대회에 재밌게 참가하자는 거니까요!
P.S. 이 글은 계속 업데이트 될 지도 모릅니다[?]. 혹시 대회를 준비하다 궁금하셨던 사항이 있으시면 거침없이 댓글을 달아주세요! xhae님의 지극히 주관적이고 편향된 의견이 빵빵 나갑니다. :-)
12년 전