소개
최근 들어 흔히 Problem Solving, 줄여서 PS라고 부르는 알고리즘 문제 풀이에 대한 사람들의 관심이 상당히 많아졌습니다.
아마 근 몇 년 사이에 부쩍 많아진 기업이나 대학 주최의 여러 알고리즘 대회들, 회사에서 코딩 테스트를 점점 중요시 여기기 시작하는 경향 등이 영향을 끼친 것 같습니다.
문제는 이 분야는 실력을 쌓기 위해 상당히 많은 시간의 공부를 요구하며 사람들의 실력 편차가 엄청나게 큰 분야라는 것입니다. 인터넷에 알고리즘을 공부하는데 도움이 되는 리소스는 굉장히 많습니다. 심지어 연습을 위해 온라인으로 참가할 수 있는 대회가 일주일에도 서너개씩 열리곤 합니다. 각종 온라인 저지에서 풀어볼 수 있는 문제는 몇 만개를 넘어가죠. 문제를 푸는데 필요한 자료구조와 알고리즘들, 어떻게 공부해야 하는지 설명한 좋은 글들도 수없이 많습니다. 하지만 자료가 너무 많고 산재해 있기 때문에 완전한 입문자 입장에서는 도리어 어디서부터 시작해야 할지 혼란스럽게 느껴지곤 합니다.
일반적으로 시중에 있는 문제 풀이에 관한 자료들은 어느 정도 알고리즘과 자료구조에 백그라운드가 있는 사람들을 대상으로 쓰여 있습니다. 특히 정말 좋은 자료로 추천받곤 하는 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략, 흔히 저자분의 이름을 따서 종만북으로 불리는 이 책은 분명 아주아주 좋은 책이지만 초보자 입장에서는 상당히 난이도가 있는 책이기도 합니다.
이 자료는 이런 PS에 관한 서적 및 인터넷 블로그 등에 있는 그 어떤 자료보다도 더 쉽고 기본적인 내용부터 다루고자 하는 목적으로 만들어졌습니다. 좀 더 명확하게 정리하자면 이 자료는 아래 정도의 지식과 능력, 목적을 갖고 있는 사람들을 대상으로 생각하고 작성했습니다.
- 학교에서 기본적인 프로그래밍 언어 수업은 배웠고 컴파일/실행할 줄은 아는데 프로그램을 짜라고 하면 잘 못 짜겠다(ex - 별로 삼각형 그리기 등의 과제도 해결하기가 쉽지 않다).
- 알고리즘, 자료구조가 필요하다고 해서 공부는 하고 싶은데 뭐부터 시작해야 할 지 모르겠고 인터넷에 있는 자료건 책이건 너무 어려워서 시작할 엄두가 안 난다.
이 자료를 기반으로 위와 같은 분들이 알고리즘 문제 해결 분야에 흥미를 갖고 꾸준히 공부할 수 있었으면 합니다.
구성
각 챕터는 해당 챕터의 기본적인 설명 및 20~30 문제 정도의 연습 문제와 그 풀이 코드 및 풀이 설명으로 구성되어 있습니다. 연습 문제가 굉장히 많은데 이 문제들은 꼭 풀어보고 넘어가기를 권합니다. PS 분야에서 모든 뛰어난 사람들이 실력을 키우기 위해서는 많은 문제를 풀어야 한다 고 이야기할 만큼 중요합니다. 다시 한 번 강조합니다. 반드시 모든 연습 문제를 풀고 넘어가 주세요.
추가로, 문제를 풀다 보면 문제가 정말 안 풀릴 때가 있습니다. 이 때 며칠이고 풀릴 때까지 그 문제를 붙잡고 있을 수도, 적당히 고민하다가 풀이를 볼 수도 있습니다. 문제가 안 풀릴 때 풀이를 언제쯤 보는게 좋다에 대해서는 다양한 의견이 있고 이에 대해서는 정답이 없다고 생각합니다. 개인적으로 초보일 때는 지식적인 면이든 테크닉적인 면이든 많이 부족하기 때문에 2~30분 정도 고민해도 문제가 안 풀리면 풀이를 보고 빨리 지식을 쌓는 게 좋다고 봅니다. 좀 더 실력이 쌓이고 나면 깊이 있게 사고하는 능력을 키우는 것도 중요하기 때문에 잘 안풀리는 문제를 길게 붙잡고 풀어보는 것도 좋습니다.
다만 여기서 한 가지 중요한 건 풀이를 보고 이해했다고 해서 문제를 풀지 않고 넘어가서는 안 된다는 겁니다. 풀이를 읽었어도 꼭 그 문제를 직접 코딩해서 정답을 맞고 넘어가 주세요. 이 것 역시 정말 중요한 요소입니다. 어려운 문제일 수록 풀이를 알아도 구현하기 힘든 경우가 많고, 실제로 구현해보면 내가 풀이를 읽고 생각했던 것과는 좀 다른 부분들이 있기 마련입니다. 이런 부분들을 직접 다 구현해보고 확실히 깨우치고 넘어가야 나중에 비슷한 문제를 만났을 때도 해결할 수 있게 됩니다.
언어에 관하여
대부분의 PS와 관련된 자료는 C++를 사용하는 것을 가정하고 작성되어 있습니다. C++가 아무래도 성능이 압도적으로 뛰어나고 PS에서 쓰기 좋은 특성을 많이 가지고 있기 때문입니다. 하지만 아무래도 C++이 주력 언어가 아닌 사람의 입장에서는 이 언어 하나만으로도 공부하는데 큰 장벽이 되고는 합니다.
이 자료를 작성한 사람 역시도 주력 언어가 C++이기 때문에 이런 부분에서는 벗어 날 수가 없고, 어쩔 수 없이 C++을 중심으로 자료를 작성했습니다. 다만 되도록 모든 연습 문제의 답안과 코드에 관한 설명을 최소한 제가 어느 정도 알고 있으면서 널리 사용되는 언어인 python으로도 설명하기 위해 노력했습니다. 가능하다면 Java로도 소개하고 싶었지만 자바의 경우 제 능력이 부족해서 작성할 수가 없었습니다.
첨부된 연습 문제에 대해 Java 예시 코드 및 설명을 작성해 주실 수 있는 분이 계시다면 언제든지 관련 내용을 Pull request로 보내주시면 적극적으로 반영하겠습니다.
이와 별개로, PS의 경우 본격적으로 공부하다보면 어쩔 수 없이 C++ 외의 다른 언어들은 손해를 보게 되는 부분이 있습니다. 다양한 언어를 배우는 것 자체도 프로그래머에게 많은 도움이 되는 일이며 PS의 경우 언어 자체에 관한 지식을 그렇게 크게 요구하지 않기 때문에 언어 학습용으로 훌륭한 수단이기도 합니다. 만약 PS를 깊이 있게 공부할 생각이 있으시다면, 문제를 풀며 C++을 같이 배워 나가시는 것을 강력하게 추천합니다.