모든 문제를 해결하기 위해서는 단계적으로 접근하는 것이 중요합니다. 단계적으로 접근해야 개선해야 할 점을 더 쉽게 찾을 수 있기 때문입니다.
- 문제를 읽고 이해한다.
- 문제를 익숙한 용어로 재정의한다.
- 어떻게 해결할지 계획을 세운다.
- 계획을 검증한다.
- 프로그램으로 구현한다.
- 어떻게 풀었는지 돌아보고, 개선할 방법이 있는지 찾아본다.
말하면 입이 아플 정도로 매우 중요합니다. 사소한 제약조건을 잘못 이해하면 문제를 잘못 해결할 수 있습니다.
자신이 생각하기 편하도록 재정의하고 추상화해야 직관력과 통찰력을 발휘하기 수월해집니다. 예를 들어 카드 문제와 맥주집 문제를 보겠습니다.
아마 대다수의 사람들은 맥주 문제가 더 쉽다고 느낄 것이다. 이처럼 자신이 생각하기 편한 방식으로 재정의하고 추상화 하려면 추상화하는 방법을 훈련해야 합니다.
문제를 어떤 방식으로 해결할지 결정하고 사용할 알고리즘과 자료구조를 선택하는 단계입니다.
계획을 세우면 곧장 코딩을 하면 안됩니다. 구현을 시작하기 전에 우리가 세운 계획이 모든 경우에 요구 조건을 만족하고 시간복잡도, 공간복잡도가 문제의 제한에 적합한지 확인해야 합니다.
코딩하는 단계입니다.
문제 해결에 당장 직접적인 영향은 없지만 장기적으로 가장 큰 영향을 미치는 단계입니다. 문제를 한 번만 풀어서는 그 문제에서 배울 수 있는 것들을 다 배우지 못하는 경우가 많습니다. 만약 한 번에 맞추지 못한 경우 오답 원인을 기록하는 것이 좋습니다.
참고문헌: 구종만, 프로그래밍 대회에서 배우는 알고리즘 문제해결전략, 인사이트, (2012)