2. 문제 해결 방법론


가장 중요한 방법론은 파인만 알고리즘입니다.

파인만알고리즘

물론 밈이니 좀 더 체계적으로 살펴봅시다.

2-1. 문제를 해결하는 과정

출처 : 프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략

  1. 문제를 읽고 이해한다.
  2. 문제를 익숙한 용어로 재정의한다.
  3. 어떻게 해결할지 계획을 세운다.
  4. 계획을 검증한다.
  5. 프로그램으로 구현한다.
  6. 어떻게 풀었는지 돌아보고, 개선할 방법이 있는지 찾아본다.

1단계 : 문제를 읽고 이해하기

가장 중요한 것은 문제를 제대로 이해하는 것입니다. 보통 가장 많이 하는 실수 중 하나는 문제의 조건을 제대로 읽지 않아 나중에 새로 짜야하는 경우 가 발생하는 것입니다.

입력과 출력의 범위, 양식, 예외 등을 위주로 읽는 연습을 하시길 바랍니다. 예제만이 전부가 아님을 꼭 기억하세요.

2단계 : 재정의와 추상화

문제의 상황들을 본인의 언어로 풀어쓰는 과정입니다. 누구는 수치를 사용하여 표를 그리기도 하고, 그래프를 그리며, 상황을 그림으로 그리는 작업입니다. 이런 과정을 추상화라고도 합니다.

문제가 요구하는 상황을 재정의하면 문제의 해결방법이 보이는 경우도 있고, 가장 중요한 것은 구현이 쉬워집니다.

3단계 : 계획 세우기

적합한 자료구조와 알고리즘을 선택하여 계획을 세웁니다. (사실상 파인만 알고리즘과 다를바 없다고 생각합니다.)

이는 아래에서 보다 살펴보겠습니다.

4단계 : 계획 검증하기

코드를 작성하기전에 적합한 계획인지 살펴보는 것은 중요합니다. 사실 구현이 불가능한 내용이라던지, 예외는 없는지, 시간은 대충 얼마나 걸릴지, 메모리는 충분한지 등을 증명해야합니다.

이 중 시간과 메모리는 1-3. 시간복잡도와 공간복잡도에서 다룹니다.

물론 시간이 없는 대회나 테스트에서는 Prove by Accept 라는 야매(?) 방법도 있지만 정석은 증명을 통해 맞는 풀이를 구현해야 합니다.

5단계 : 계획 수행하기

결국 개발자에게 가장 중요한 것은 구현입니다. Talk is Cheap, Show me the Code 라는 리눅스 창시자, 리누스 토발즈의 말처럼 코드를 짤 수 있어야 합니다.

6단계 : 회고하기

문제를 해결하면 단순하게 넘어가기 보다는 남들은 메모리를 어떻게 줄였는가, 시간을 어떻게 더 빠르게 했는가, 코드를 어떻게 깔끔하게 작성했는가 등을 고민해보는 시간이 필요합니다.

틀린 과정으로 접근했다면 그 이유를 정리해보는 것도 좋습니다. 아는 문제를 푸는 것은 당연하고, 제일 중요한 건 몰랐던 문제를 푸는거 아닐까요?

문제를 많이 해결하는 것보다는 아는 문제도 고민하는 시간을 늘리는 것이 실력 성장에 도움이 됩니다.

2-2. 문제 해결 전략

결국에는 경험의 반복, 유형 적응이지만, 다음과 같은 전략이 있을 수 있습니다.