ACM 문제 풀지마라

Posted 2007. 6. 19. 02:31
ACM-ICPC(International Collegiate Programming Contest)는 전세계 대학생들이 모여서 프로그래밍 실력을 겨루는 대회로 우리나라에서도 많은 분들이 참여해서 좋은 성적을 거두고 있습니다. 대회는 경쟁 방식으로 짧은 시간 안에 많은 문제를 풀면 됩니다.

문제가 깔끔하고 정답이 딱 떨어지기 때문에 평가하기가 좋은 관계로 많은 대학에서 학부 1, 2학년 프로그래밍 언어 실습 문제로 ACM 문제를 활용하고 있습니다. 제 경험으로도 1학년 때 C 언어 수업, 2학년 때 객체지향언어(C++) 수업 프로젝트 일부가 ACM 문제로 나왔습니다.

ACM 문제는 주로 알고리즘 위주의 문제로 빠른 두뇌 회전력과 사고력을 요구하기 때문에 사고력을 향상시키는 데 많은 도움이 됩니다. 하지만 문제 풀이가 어느 정도 숙달되고 나면 그 뒤로는 사실상 눈높이 수학 식의 문제 풀이 연습 밖에 되질 못합니다. 딱 떨어지는 정답을 만들기 위해 단순화시킨 요구사항과 언제나 정답이 있다는 가정 때문에 깊은 사고력에는 오히려 방해가 되는 것이죠.

그래서 일부 교수님들은 대학교 3-4학 넘어가면 ACM 문제 풀지 말라고 충고하시곤 하셨습니다. 알고리즘 위주의 ACM 문제 풀이는 프로그래밍 연습이 필요한 1,2학년 때는 많은 도움이 되지만 보다 깊이 있는 이론과 복잡한 현실 문제를 다뤄야 하는 고학년에게는 오히려 사고를 단순화시킬 수 있다는 것이죠.

사실 ACM 문제는 문제별로 난이도 차이는 있지만, 한 문제만 놓고 살펴보면 조금 똑똑한 학부 1-2학년에게 시간만 충분히 주면 누구나 풀 수 있는 쉬운 문제에 지나지 않습니다. 물론 짧은 시간 안에 척척 문제를 풀어내는 것은 아무나 할 수 있는 일은 아니지만 ACM 문제 풀이에만 익숙해진다는 것은 복잡한 덧셀 뺄셈을 빨리하는 연습을 한 초등학생과 다를 바가 없다는 것이죠.

사실 실제 소프트웨어 작성에서 분초를 다투는 알고리즘 작성 능력은 별로 중요하지 않습니다. 시간이 조금 걸리더라도 깊이 있게 사고하고, 유연하고 견고한 디자인을 하는 능력이 더 중요하죠. 칠판에 문제 써놓고 5분 안에 면접관 안에서 알고리즘 못 만들어냈다고 떨어뜨리는 압박 면접 회사는 정작 중요한 인재를 놓치고 있는지도 모릅니다.

소프트웨어 작성에서 결국 중요한 것은 명세(Specification)과 디자인(Design) 능력입니다. 명세와 디자인을 끝내고 함수 정의를 만들어주면 누구나 비슷한 결과물을 산출해 냅니다. 실제로 회사에서 방학 때 인턴을 시켜보면 명세와 디자인을 다 주고 코드를 짜오라고 했을 경우와 어떤 프로그램이 필요하다고 말만 해줬을 경우 그 결과의 차이는 확연합니다.

정리하면, ACM 문제 자꾸 풀면 득보단 해가 됩니다. 물론 타고난 재능으로 ACM 문제를 잘 푸는 것은 좋은 재능이지만, ACM 문제 풀이 속도가 좋은 개발자임을 증명하는 것은 아닙니다.


--

며칠 안 들어온 사이에 리플이 너무 많이 달려서 일일이 답변해 드리지는 못하고 여기 간단히 의견을 남깁니다. 이 글은 ACM을 세계 대회 수준으로 진지하게 준비하고 알고리즘과 데이터 구조의 깊이를 추구하시는 분들을 비하하기 위해 쓴 글이 아닙니다. (제가 어찌 감히 그럴리가 있겠습니까.)

다만 어떤 종류의 시험이든 평가 방법의 한계상 측정하지 못하는 다른 능력들이 많이 있다는 사실을 말하고 싶은 거였죠. 토익이나 토플 만점이 영어를 잘한다는 척도가 되지만, 그렇다고 토익이나 토플 공부만 해서는 영어를 잘할 수 없는 것과 같은 논리를 편 것이죠. 프로그래밍 대회의 경우 ACM을 구체적인 예로 들었지만, 꼭 ACM 뿐만 아니라 어떤 종류의 시험이든 마찬가지고요.

단지 프로그래밍을 잘하기 위해서 혹은 알고리즘이나 데이터 구조를 깊이 공부하기 위해서 무작정 ACM을 푼다는 상황은 오히려 역효과를 가져올 수도 있다는 이야기를 한 것입니다. ACM 공부하시면 알고리즘 책도 보시고, 논문도 읽어보시고, 연구도 하실텐데 그런 과정을 모두 ACM 문제 풀이로 포함하시면 ACM 문제 푸는 것도 당연히 많은 도움이 되리라 생각합니다.

너무 강한 어조로 글을 작성해서 본의보다 글이 더 나간 것 같네요. 아무쪼록 열심히 ACM-ICPC 준비하시다가 'ACM 대회에 입상도 못하고 초보 수준의 문제 몇 개만 풀어보고 함부로 이야기하는 놈'이 쓴 글을 보고 분해하신 분들은 오해 푸시길.^^;;