웹 서핑을 하면서 블로그를 읽다가 흥미로운 글을 하나 읽게 되었다.

서광열님의 소프트웨어 개발 이야기 에 올라와 있는 ACM 문제 풀지말라 

요지는 ACM-ICPC(세계 대학생 프로그래밍 경시대회) 유형의 문제들은 딱 떨어지는 정답을 만들기 위해 단순화시킨 요구사항과 언제나 정답이 있는 문제이기 때문에 저학년의 프로그래밍 공부에 도움이 될지 몰라도, 학부 고학년 수준에 이르게 되면 눈높이 수학식의 문제 풀이 연습밖에 되지 않기 때문에 프로그래머로서의 깊이있는 사고능력과 다양한 디자인 능력을 오히려 방해한다는 것이다.

ACM-ICPC 에 출전했었고, 현업에 있는 지금도 ACM-ICPC 유형의 알고리즘 문제들을 재미삼아, 공부삼아 푸는 입장에서 이 주장에 대해 일부 공감이 가면서도 반론을 제기하고 싶다.

우선 이 블로그의 의견에 동의하는 것은, 많은 ACM-ICPC 준비생들이 빠지기 쉬운 오류 중 하나로 알고리즘이나 기출문제들을 공식처럼 외우고, 쉬운 문제들을 빨리, 많이 푸는 기계적인 연습을 해서 자신이 기존에 풀어본 문제와 비슷한 유형이 출제되거나, 혹은 본인이 알고있는 알고리즘을 끼워넣으면 바로 풀리는 문제를 풀수있게 훈련을 한다는 것이다. 보통 이런 사람들은 아는 문제는 쉽게 쉽게 금방 풀지만 조금만 응용이 되거나 사고를 요구하는 문제에는 손을 놔버리는 경우가 많다. 또한 실제 이런식으로 공부를 하면 연습할때는 문제를 많이 푼 것 처럼 보여도 실제 대회나 프로젝트에 임하였을때는 그동안 공부한 것이 큰 도움이 되지 못하는 경우가 많다. 알고리즘을 공식처럼 끼워서 푸는 문제상황은 대회에서나 현업에서나 그리 잘 발생하는 경우가 아니기 때문이다. ( 가끔 있긴 있다. )

ACM-ICPC 의 본래 취지를 생각해보면 책에서 배운 알고리즘을 외워서 예제처럼 집어넣으면 바로 풀리는 문제들을 푸는 대회는 아닐 것이다. 다만 ACM-ICPC 출전자들의 수준차는 IOI 부터 준비한 최상위권 학생들부터 일반학생들에 이르기까지 다양한 스펙트럼을 보여주고 있어 실제 대회에서 모두 어려운 문제들로만 출제가 된다면 변별력도 없고, 준비한지 얼마 되지 않는 학생들에게 대회에 대한 의미가 없을 수 있기 떄문에 쉬운 문제 2-3 문제에 어려운 문제가 혼용되어 출제하는 것이라 생각한다.

사실, 개인적으로 ACM-ICPC 에 대해 많은 추억을 갖고 있는 입장으로서 이 글에 대해서는 반론을 많이 제기하고 싶다. 우선, ACM-ICPC 유형의 문제들은 다양한 패턴의 풀이가 나오는 경우들이 많다. 같은 문제를 풀더라도 O(N^2) 로 푸는 사람이 있는가하면 O(N) 혹은 O(1) 로 푸는 방법도 있을 수 있다.

자신이 처음에 구상한 알고리즘과 자료구조를 갖고 문제를 풀어본 후, 자기보다 더 깔끔하고 효율적으로 문제를 푼 사람의 소스코드를 보면 많은 것을 배울 수 있다. 동일한 Spec 의 문제를 다른사람은 어떻게 접근하여 해결했는지를 배울 수 있는 중요한 기회이며, 현업의 실제 프로젝트에서는 이런 방식의 경험을 하기가 상당히 어렵다.

또한, boundary test 나 overflow 와 같이 실제 프로젝트에서 치명적으로 발생하는 유형의 버그에 대한 경험을 다양하게 해볼 수 있다. ACM-ICPC 의 문제들은 솔루션의 무결성을 점검하기 위해 다양한 test data 를 제공하는데, 모든 test case 를 통과할 수 있는 깔끔하고 완벽한 솔루션의 중요성을 직접 체험할 수 있는 더없이 좋은 기회가 바로 이런 알고리즘 문제풀기라 할 수 있다. 현업에서는 개발 - QA 테스트를 통해 진행되는 프로세스를 ACM 문제풀이를 통해 단순화시켜 경험해 보고 있다고 볼 수 있는 것이다.

특히, 알고리즘(algorithm) 이란 학문은 책으로만 배워서는 안되며, 실제 알고리즘을 다양한 응용사례에 맞게 직접 구현해 보는 것이 무엇보다도 중요한데, 알고리즘의 공부에 있어서 ACM-ICPC 유형의 문제를 풀어보는 것은 정말 좋은 공부방법이라 할 수 있다.

Google 이나 IBM,  Microsoft 와 같은 회사들이 기술면접에서 ACM-ICPC 유형의 알고리즘 문제를 면접때 제출하는 것은 여러가지로 시사하는 바가 크다고 생각한다. (사실 위와 같은 대기업 뿐만 아니라 외국의 IT 회사들은 많은 회사가 이런 소위말하는 "압박면접" 을 채택하는 것으로 보인다. 외국 회사의 기술면접 스타일에 대해서는 "조엘 온 소프트웨어" 를 보면 잘 나와있다. )

ACM-ICPC 와 같은 문제풀이의 장점을 한 가지만 더 들자면 ACM-ICPC 나 TopCoder 와 같은 대회 참가를 통해서 세계 각국의 수준높은 프로그래머들을 많이 만날 수 있고(온라인 상이서 혹은 오프라인 상에서) 그들의 솔루션과 소스코드를 분석해 볼 기회가 생기며 - 앞서 말했듯이 같은 문제를 나와 다른 자료구조와 알고리즘, 다른 코딩 테크닉을 활용해서 그들이 어떻게 풀었는지를 보는 것은 정말 중요하다 - 이러한 과정에서 본인에게 굉장한 motivation 을 줄 수 있는 기회가 된다. 추가로 이런 대회에서 성적이 좋으면 본인의 이력서에 멋진 이력으로 추가할 수 있다. 그리고 무엇보다도 재미 라는 즐거움이 있다. ^^

댓글을 달아주세요!
  1. BlogIcon Neon 2007.07.03 00:27  댓글주소  수정/삭제  댓글쓰기

    문제를 외워서 푼다고 생각하는 사람은 그렇게 골치아픈 문제를 왜 풀려는 걸까요?
    똑똑한 학부 1~2학년생이 한참 들여다보면 뭐든지 풀 수 있다는 말도 참 어이없게 들립니다. 3명이 그런식으로 문제 풀면 금새 6~7문제 풀고 월파 나가겠네요.

    • BlogIcon soyoja 2007.07.03 16:16  댓글주소  수정/삭제

      네... 솔루션을 외우거나 고민도 안해보고 답부터 먼저보고 문제를 푸는 경우를 이른바 "문제낭비" 라고 KOI4U 에서 표현하더군요... ^^
      그리고 문제는 정말 그 유형과 깊이가 다양해서... 한참 들여다보면 결국 풀리는 문제가 있고... 며칠, 심지어 몇달 혹은 몇 년? (물론 몇년동안 계속 그 문제만 생각하는 것은 아니겠지만) 에 걸쳐서 고민하게 만드는 문제도 있더군요.. ^^

  2. JongsooLee 2007.07.03 02:03  댓글주소  수정/삭제  댓글쓰기

    정말 ACM 문제가 안 좋으니 풀지 말란 소리는 아닌 것 같은데...^^
    "알고리즘도 중요하지만 알고리즘만 중요한 건 아니고 다른 중요한 것도 많으니...넓게 보세요."라고 얘기하는 것처럼 보임.
    근데 그 포스트 보니 제목을 좀 자극적으로 쓰기는 했다...ㅎ

    • BlogIcon soyoja 2007.07.03 16:19  댓글주소  수정/삭제

      엉. 근데 처음 글쓰신 분은 ACM 문제풀이가 득보다 해가 많다고 본문에 언급을 했길래...나는 반론을 제기한거지. =)

  3. persona 2011.01.06 20:26  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사합니다.
    올해 ICPC 대회를 나가기 위해 준비를 하고 있는 대학생으로서 느끼는 점이 많은 글이었습니다.
    ICPC 대회를 나가겠다는 결심은, 재미와 이력서의 멋진 한 줄 이었는데,
    어느 순간부터인지, 이력서의 멋진 한 줄을 위한-상위권 입상을 위한- 암기식 공부가 되어가고 있었네요.
    천재는 노력하는 자를 따라가지 못하고, 노력하는 자는 즐기는 자를 따라가지 못한다는 말이 생각납니다.
    지금부터라도 즐기는 입장에서, 초심으로 돌아가서 열심히 준비하겠습니다.
    정말 좋은 글 감사합니다.
    새해복 많이 받으시고, 겅강하시기 바랍니다.

  4. persona 2011.08.15 09:48  댓글주소  수정/삭제  댓글쓰기

    겅강하세요!!!!!!

  5. ㅋㅋㅋ 2015.03.23 17:14  댓글주소  수정/삭제  댓글쓰기

    미국에서 공부하다가 미국 회사에 지원하려면 Top5에 못드는 회사들의 인터뷰 문제들은 ACM 1~2번 문제들로 되어 있음. 이거 서명하고 인터뷰 한건데 말해도 되나... 구x회사에서 내는 문제들은 ACM맨 뒤의 문제들로 되어 있음. 다 풀어야죠. 풀지말라는 개똥같은 소리고 ACM같은 문제들을 풀 수 있으면 그 때부터 풀지마라입니다. 한국이 세계적인 IT 기업(하드웨어 말고)이 하나도 없는 이유가 기본적인 소양을 무시하고 앞으로 나가려니 없는 겁니다. 누가 그런 말을 했는지 몰라도 참... 아참... 교수가 그런 이야기한다고 해서 들으면 큰일나요. Ph.D들의 목적은 교수기 때문에 기업에서 원하는, 진정한 개발자가 되는 길을 모르는 사람들입니다. 실제로 Ph.D들의 프로그래밍 실력은 미국에서 학부 졸업해서 IT 회사에 취직한 꼬마애들보다 실력이 떨어져요. IT기업에 있다가 교수로 온 사람들은 제외하구요. 이 사람들은 정말로 Know it all입니다.

    • BlogIcon mynotepad 2015.04.06 02:44 신고  댓글주소  수정/삭제

      공감합니다. 특히 국내 IT 업계는 기본소양에 더 충실해야죠...
      교수님들의 말씀은 업계 현실과 거리가 있는 경우가 많으니 졸업해서 현업에서 일하는 선배들의 의견도 같이 들으면서 필터링이 필요하다고 생각합니다.

  6. ㅋㅋㅋ 2015.03.23 17:21  댓글주소  수정/삭제  댓글쓰기

    아참... ACM유형의 문제지 ACM 문제는 아녜요. 주로 본문에 언급하신 회사들의 인터뷰에서 나오는 것들은 대학원 최근 논문(90년대~) 알고리즘이나 자료구조에서 나올 때도 있고... OS나 Database에서 쓰이는 스케쥴링이나 클러스터링, 리소스관리 등등의 알고리즘 관련해서 ACM 형식으로 살짝바꿔 인터뷰 때 출제하는거에요. 물론 기본적인 이런 지식을 알고 있으니 ACM 유형에 익숙하니 바로 지식을 끄집어내서 답할 수 있는거구요.

이름 암호 홈페이지