저는 Competitive programming이 싫습니다.

안녕하세요. zlzmsrhak입니다.

저번 크리스마스날 슬랙에 올라온 koosaga님의 코멘트를 보고 생각나는 것들이 있어서 말해보려고 합니다.

http://codeforces.com/blog/entry/49289#comment-332844


먼저 알고리즘 문제를 해결하는 것(PS)과, 그것으로 대회를 하는 것(CP)의 차이점을 집고 넘어가려고 합니다.

두 분야의 차이점은 시간 제한이 있다는 것 밖에 없지만, 이것으로 매우 많은 점이 달라지게 됩니다.

알고리즘 문제를 푸는 것에 제한시간이 없다면, 문제를 해결하기 위한 많은 시도들을 할 수 있습니다.

codeforces E 정도의 매우 어려운 난이도를 매우 다양한 알고리즘으로 접근해 볼 수 있고,

문제를 해결하기 위한 보조정리를 찾아내거나 여러 성질들을 발견하는 데 오랜 시간을 투자할 수 있습니다.

이런 식으로 문제를 해결하려고 시도하는 것은, 제 생각이지만, 사고력과 알고리즘 실력에 도움이 될 것이라고 생각합니다.

하지만 CP는 이것과 양상이 전혀 다릅니다. Codeforces에서 극단적으로 나타나는 현상인데,

레드 코더들은 ABC를 1시간 내에 해결한다고 해도 DE를 해결하기 위한 시간이 1시간 밖에 남아있지 않습니다.

어려운 문제들임에도 불구하고 코딩 시간을 제하면 알고리즘을 적어도 40분 내에는 생각해 내어야 합니다.

이것은 곧 문제를 빨리 해결하기 위한 테크닉을 익혀야 한다는 뜻이고, 이것은 코딩을 빨리 할 수 있는 연습을 포함하여,

문제를 접했을 때 답의 방향을 빠르게 유추하고 빠르게 접근하는 방식이 필요합니다.

이를 위해서 수많은 테크닉들과 수많은 문제들을, 풀어보고 기억하여 빠르게 꺼내 쓸 수 있는 능력도 중요해집니다.


현재 열리는 대회들은 PS와 CP를 적당히 섞은 어딘가에 위치하고 있습니다.

연구 분야는 극단적인 PS 분야라고 생각하고, 시간대비 문제수가 가장 적은 xOI류 대회,

사고력의 도움을 받아야 하는 기업 대회들과 ICPC, Codeforces 순서로 적당히 섞여있습니다. (TCO는 본 적이 없어서..)

먼저 xOI부터 봅시다. xOI 문제들의 경우 대부분 문제 해결을 위한 깊은 사고를 해야 하는 문제들입니다.

3문제 5시간은 많은 시간은 아니지만, 꽤 많은 방법으로 문제를 접근해 볼 수 있는 정도의 시간이라고 생각합니다.

문제를 "빠르게" 해결하기 위한 테크닉을 익히지 않아도, 어느 정도의 알고리즘 실력과 사고력만 있다면 됩니다.

기업 대회들과 ICPC의 경우, 당연하게도 기업에서는 코딩을 안할 수 없기 때문에, 코딩 스킬이 대회 평가에 들어갑니다.

xOI보다 많은 문제수에 적은 시간으로 대회를 치르게 됩니다. (ICPC의 경우, 3명이 한 컴퓨터를 쓰기 때문에 시간이 생각보다 많지 않습니다)

이 때부터 코딩을 빠르게 할 수 있는 능력과, (시간이 줄었기 때문에) 문제를 빠르게 접근할 수 있는 능력을 요구하게 됩니다.

자연스럽게 사고력의 비중이 줄어들게 됩니다.

CF는 오락성에 중점을 두고 있는 대회이고, 그 때문에 문제 당 시간이 매우 적습니다.

코딩 속도와 정확도가 매우 큰 요인으로 작용하게 되고, 사고력과 알고리즘 문제 해결 능력의 비중이 크게 줄어들게 됩니다.


제가 가장 열심히 공부했던 시기는 고등학교 1학년 2학기와 대학교 2학년 1학기 정도인 것 같습니다.

푼 문제의 수만 따진다면 각각 기껏해야 100문제 정도를 풀었다고 생각합니다.

하지만 그 문제 각각을 짧게는 하루, 길게는 1주일에서, 극단적인 경우 한달 정도 문제를 고민했던 것 같습니다.

가장 기억에 남는 문제는, 이것 말고도 여러가지가 있지만, KOI 고등부 계통트리 문제입니다.

http://59.23.27.112/pool/koi_tree/koi_tree.php?pname=koi_tree

문제를 해결하기 위해 혼자서 거의 1주일 내내 (밥먹을때, 자습시간, 버스나 지하철, 걸어다닐 때 등등) 고민을 했던 것 같습니다.

지금 생각해보면 문제를 풀기 위해 생각하는 과정이 재밌어서 오랫동안 풀었던 것 같습니다.

개인적인 견해입니다만, 이런 것들에서 문제를 해결하는 능력이 많이 올랐던 것으로 생각합니다.


14-15 ICPC WF에서 만족스럽지 않은 결과를 받은 뒤, 제 실력이 심하게 많이 편향되어 있다는 것을 알게 되었습니다.

그때부터 공부 방법에 대해 많은 조사를 하기 시작했고, 매우 많은 종류의 공부 방법을 알게 되었습니다.

그 중 의미있는 결과는, 문제를 고민하는 시간이 짧을수록 CP쪽으로 특화되고, 길수록 PS쪽으로 특화되는 경향이 있었습니다.

즉, 문제를 2~3시간동안 고민을 해 보고, 안풀리면 답을 보는 사람의 경우, 코딩 실력에 특화된 경우가 많았습니다.

반대로 문제를 적어도 하루정도 고민하는 경우, 문제해결능력에 특화된 경우가 많았습니다.

이것 말고도, BOJ 랭킹의 10등 내의 사람들은 코딩 시간이나 정확도가 문제해결능력을 따라가지 못하는 경우는 없는 것 같습니다.

(지금 생각해보니, 원인-결과가 반대일 가능성도 있는 것 같습니다. 서로 양성피드백일 수도 있고..)


솔직하게 말하면, 저런 것들을 "매우 긴 시간동안 꾸준히 할 수 있는 능력"도 재능이라고 생각하기 때문에,

결국 노력도 재능이라는 생각이 들기는 합니다.


저 결과를 발견한 후 코딩에 들이는 시간을 늘리기로 결심했습니다.

어느 정도 랭작도 했었고, 문제를 보고 안풀렸을 때 답을 보는 시점도 앞당겼습니다.

이런 식으로 공부 방법을 바꾸고 나니, CP가 더 이상 재미있는 무언가가 아니게 되었습니다. 코딩을 빠르고 정확하게 하는 능력은

제가 재미있어하는 부분과는 거리가 매우 멀었습니다. 평소에도 실수를 자주 해서 학점 두세등급 깎아먹는게 일상인데,

CP에서는 코딩 실수 하나 하면 10분씩 날라가고, 패널티는 늘어가고, 특히 CF는 systest에서 엄청나게 틀렸습니다.

기억에 남는 것은 Div1 ABCD를 풀었는데, AB는 systest에서 틀리고, D는 오타가 있어 pretest에서 틀렸던 적이 있습니다.

특히 경쟁 구도를 매우 싫어하는 제 성격상 대회 결과를 보는 것이 정신건강에 안좋은 영향을 미쳤던 것 같습니다.

그래서 점점 CP를 공부하는 시간이 줄어들었던 것 같습니다.


저는 CP를 알고리즘 대회라고 보지 않습니다. 알고리즘 능력이 없으면 문제를 풀 수 없지만, 마찬가지로 코딩 능력도 같기 때문에,

결국 두 가지를 섞은 어딘가에 대회가 위치한다고 생각합니다.


다시 koosaga 님의 블로그 댓글로 돌아가보겠습니다.

"Your time is better spent studying machine learning, or statistics, or compilers, or distributed systems, or just about anything else in computer science."

저는 이 문장에 조건부 동의를 합니다.

  1. CP가 재미없어야 합니다.
  2. 문제해결능력과 코딩 능력이 있어야 합니다.
  3. 대체재가 재미있어야 합니다.

대부분의 경우 2번의 기준을 퍼플 정도로 잡는 것 같습니다.

재미없는 것들을 굳이 열심히 해야 하는지도 모르겠고, CP가 문제해결능력과 직결되는 것도 아닌데다가,

알고리즘을 공부하는 것은 CP를 잘 하기 위한 공부와는 어느정도 거리가 있다고 생각하기 때문에

굳이 스트레스까지 받아가면서 공부할 필요를 느끼지는 않습니다.


질문이나 의견은 댓글로 달아주시거나, 익명 질문의 경우 ask.fm을 사용해주세요

http://ask.fm/Rhak__


댓글 (12개) 댓글 쓰기


plzrun 7년 전

구사과님 글 쓰신거 몰랐는데, 키큰고마님 덕에 가서 잘 읽고 왔습니다.

"Your time is better spent studying machine learning, or statistics, or compilers, or distributed systems, or just about anything else in computer science."

(혹시나 해서 그러는데 위의 문장은 사과님 의견이 아닙니다.)

이런 멘트 자체가 정말 useless해 보이네요. 사과님 답변에 동의 ㅎㅎ (고마님 글을 이상하게 내맘대로 해석해서 동의를 한다음 말하자면) 역시 퍼플정도 되면 이해해드리겠습니다. 저는 아직 고통받으며 공부해야할때라..ㅋㅋ 남들도 고통받아야 한다고 말하는건 아닙니다만, 저보다 못하시는 분들은 고통좀 받으셔야 할듯.

CP랑 PS랑 구분해본적은 없었는데.. 그냥 다시 한번 생각해보게 됐어요. 개인적으로는 딱히 구분지을 필요는 없을거 같다고 생각되네요. 어차피 PS를 즐기려면 어떤식으로든 CP가 그 방법이 될 수 밖에 없으니까?ㅎ 그리고 결국 잘하시는 분들은 둘다 잘하니까... 저는 그런 분들 롤모델 해서 열심히 쫓아가는 수밖에 없는 듯


zlzmsrhak 7년 전

수학 문제를 푸는 취미를 가진 사람이 있듯, PS를 그 자체만으로 즐길 수 있다는 말을 하고 싶었어요.


koosaga 7년 전

  1. 제가 말하는 competitive programming은 problem solving과 동의어였습니다. 그러니까 online judge 스타일 코딩을 요한다면 그게 연구 과제던 코딩이 얼마나 짧건 경쟁 관계건 아니건 competitive programming으로 봤다는 겁니다. 이렇게 본 이유는 단순히 제가 반론을 제기한 글의 작성자가 그런 워딩을 썼기 때문입니다. 저 역시도 즐즘스르핰님의 용어가 옳다고 생각합니다.

  2. CP와 PS에 대한 언급을 하셨고 전반적인 맥락에 동의합니다. problem solving의 구현 형태가 competitive programming이라고 생각을 하고, 진입 장벽이나 이런저런 단체들의 요구사항이 반영된 결과가 다양한 대회의 현재 모습이라고 생각을 합니다. 월파에 계속해서 문제가 늘어나는 모습이 저는 상당히 마음에 안 드는데, 문제가 많음에도 불구하고 어렵기 때문에 (...) 그리고 러시아 애들은 다 풀기 때문에 (........) naive한 생각이 아닌가 싶기도 하네요.

  3. 2번의 내용을 더 덧붙이자면, 결국 같이 사는 세상입니다. implementation 문제를 좋아하시는 분들도 있고 이러한 분들을 필요로 하는 커리어도 많습니다. 즐즘스르핰님같이 한 문제에 하루 정도 잡는 스타일을 좋아하시는 분들도 있고요. 그리고 어떤 분들에게는 하루 잡아야 고민하는 문제가 어떤 분들에게는 3분 컷 문제가 되기도 합니다. 저명한 대회 (특히, ICPC / 코드잼과 같이, 순수한 목적으로 운영되지 않는 대회) 의 경우에는 특히 이러한 고민이 많이 투영되어 있을 것이라고 생각합니다. 제 생각은... 물론 코딩 잘하면 대회에서 이득을 크게 볼 수 있지만, 저는 아직까지 코딩 느려서 대회에서 제 실력을 못내는 사람은 단 한번도 못봤습니다. (그런 경우가 있다면 팀 대회를 통해서 그러한 점을 보충했던 것 같네요.) 아직까지 대부분의 CP는 algorithmic in nature하다는 게 제 중론이에요. 정도의 차는 있지만...

  4. "즉, 문제를 2~3시간동안 고민을 해 보고, 안풀리면 답을 보는 사람의 경우, 코딩 실력에 특화된 경우가 많았습니다." -> 가령 남들이 30분동안 푸는 걸 2~3시간씩 고민했다는 건 그냥 하루 지나도 못푼다는 뜻이라고 생각합니다. 그때는 배워야 한다고 생각합니다. 물론 남들이 2시간 푸는 건 하루 고민하는 게 맞겠다만... 아무튼, 고민하는 시간은 사람마다 다르고 2~3시간이라는 기준을 바로 적용하는 건 너무 일반화가 심하다고 생각합니다. 우리는 공부하는 사람들이고 공부법은 다를 수 있습니다.

  5. 글에 3가지 기준을 언급하셨는데 거기에 대해서는 적극적으로 동의합니다. 저는 사람들이 시키는 거 내지는 유행하는 걸 하기보다는 좋아하는 걸 해야 하는 세상이 되어야 한다고 생각합니다. CS는 그런 관점으로만 공부해도 충분히 가치를 찾을 수 있을 만큼 좋은 분야라고 생각하고요. 저는 CF 2000 ~ 2200를 기준으로 잡습니다. 물론 이것도 작위적인 기준입니다. 여담으로 Splay Tree로 유명하신 Daniel Sleator이라는 CMU 교수님은 코포 cyan이시네요. 무려 Ocaml로 대회하시는 (....) http://codeforces.com/profile/Darooha

  6. 장문의 좋은 글 써주셔서 감사하고 써주신 기념으로 팬싸인 한번만 부탁드립니다 꺄악


zlzmsrhak 7년 전

  1. 단순히 알고리즘 실력이 뛰어나도, 코딩 속도가 느려서, 혹은 정확도가 떨어져서 대회를 망치는 경우도 많이 있습니다. 그런 경우가 없다는 뜻이 곧 코딩 실력이 알고리즘 실력을 받춰준다는 뜻인 것 같습니다.

  2. 제가 많은 자료 조사를 했었는데, 수준 이상의 사람들이 고민하는 시간이 대부분 2~3시간이어서 그렇게 언급했습니다. 공부법이 다를 수 있다는 것에는 동의하고, 문제를 풀 수 있게 되는데 걸리는 시간은 30분, 하루, 일주일 어느 것도 가능하다고 생각합니다.


  1. 호에에..

h0ngjun7 7년 전

화이팅


isangyoon 7년 전

오랜만에 재밌는 글을 읽었네요. 구사과님 의견에도, zlzmsrhak님 의견에도 동의하는 편입니다. 아, 먼저 제 소개를 드리고 시작하는 것이 좋겠군요. 저는 디자이너이고요. PS는 정말 취미로 하고 있습니다. 단순히 배우는 것이 재밌고 지식적인 욕심과 문제를 푸는 과정에서 느끼는 재미와 즐거움이 원동력이라고 할 수 있겠네요.

그렇지만, 평가가 필요한 분야가 분명히 있다고 생각합니다. 그렇기에, 언급하신 PS가 CP와 같은 형태로 나타나게 된 것이지요. 그러나 CP를 못한다고 프로그래머로서의 자질 혹은 지적인 능력이 떨어진다 혹은 컴퓨터적인 사고능력 (수학적)이 떨어진다고 생각하진 않습니다. 이미 대부분의 백준 상위랭커분들은 대회가 주 목적이 아니라, 정말 문제를 푸는 즐거움 때문에 이 분야에 발을 들이신거라 봅니다.

저는 언급하신 PS와 CP의 차이점보다 가장 아쉬운 것이 바로 한국 취업 시장이라고 봅니다. 언젠가부터 굉장히 PS를 강조하면서 강요하게 되었고, 이를 시험 및 상업화 하여 취업을 위한 PS를 하는 시점이 되어버린 것 같습니다. 많은 분들이 특정 회사에 입사하기 위해서 의도치 않게 PS를하지 않고 CP를 하게 되는 것이죠.

저도 하루에 많으면 한문제, 길게는 일주일 넘게 같은 문제를 고민해 볼 때가 있습니다. 그렇게 고민하다 풀었을 때 그 쾌감이 너무 좋아서 그런 것이지요. 대부분 쓰신 의견이 저도 그렇게 느끼고 있어서 그런가 참 재밌게 읽었습니다 :)


tae 7년 전


koosaga 7년 전

zigui님 지금 그래서 최근 코포 등수가????????


tae 7년 전

왜 여따달앜ㅋㅋㅋㅋ


outersky 3년 전

3년전에 깡을 발굴 하시다니... 시대를 앞서가셨네요


wans038 6년 전

많은 생각을 하게 되네요... 긴 글 잘 읽었습니다. 감사합니다.


zihasoo 2년 전

이런 저런 생각이 많이 드네요