문제 분해
본문바둑판처럼 생긴 동네에서 학교는 왼쪽 위 모퉁이, 집은 오른쪽 아래 모퉁이에 있다. 가로로 10블록, 세로로 10블록이다. 돌아가지 않고 오른쪽과 아래로만 걷는다면 집까지 가는 길은 몇 가지일까? 길을 하나하나 그려 세면 끝이 없다. 그런데 '바로 앞 모퉁이까지 오는 길의 수를 이미 안다면?'이라고 물으면 길이 보인다. 어려운 문제를 작은 문제로 나누어 푸는 방법을 알아보자.
3.3.1부분 문제로 나누기
집에 도착하는 마지막 걸음은 바로 위 모퉁이에서 내려오거나, 바로 왼쪽 모퉁이에서 건너오는 두 가지뿐이다. 그래서 집까지 오는 길의 수는 위 모퉁이까지 오는 길의 수와 왼쪽 모퉁이까지 오는 길의 수의 합이다. 위 모퉁이와 왼쪽 모퉁이까지의 길의 수도 같은 방법으로 구할 수 있다. 이렇게 큰 문제의 답을 같은 모양의 더 작은 문제들의 답으로 나타내는 것이 문제 분해이다. 맨 윗줄과 맨 왼쪽 줄의 모퉁이는 한 줄로만 갈 수 있어 길이 한 가지씩이다. 이것이 더 나누지 않는 가장 작은 문제이다.
출발점에서 아래로 \(i\)칸, 오른쪽으로 \(j\)칸 떨어진 모퉁이까지의 길의 수를 \(P(i, j)\)라 하면 \[P(i, j) = P(i-1, j) + P(i, j-1),\qquad P(0, j) = P(i, 0) = 1\]이다. 이 값은 \(\dbinom{i+j}{i}\)와 같다. 작은 문제의 답을 표에 적으며 위에서 아래로 채우면 각 칸을 한 번씩만 계산한다.
그림 1에서 격자의 크기를 바꾸어 보자. 가로 4, 세로 3이면 표의 맨 끝 칸은 35이다. 각 칸의 수를 위 칸과 왼쪽 칸에서 더하기만 하면 되므로, 칸의 수만큼만 계산한다. 가로 10, 세로 10이면 끝 칸이 184756으로, 길을 하나하나 그려 세면 18만 번 넘게 그려야 하지만, 표는 121칸만 채우면 된다. 이 표를 채우는 방법은 파스칼의 삼각형을 만드는 방법과 같다.1
3.3.2분해의 두 갈래
문제를 나누는 방식은 크게 두 가지로 이어진다. 부분 문제들이 서로 겹치지 않으면, 나누어 따로 풀고 그 답을 합치는 분할 정복이 알맞다. 리스트를 반으로 나누어 각각 정렬한 뒤 합치는 병합 정렬이 그렇다. 격자 경로처럼 같은 부분 문제가 여러 큰 문제에 거듭 쓰이면, 한 번 구한 답을 표에 적어 두고 다시 쓰는 동적 계획법이 알맞다. 그냥 재귀로 풀면 같은 모퉁이의 길의 수를 수없이 다시 계산하기 때문이다. 어느 쪽이든 '부분 문제가 무엇이고, 그 답으로 전체 답을 어떻게 만드는가'를 찾는 것이 출발점이다.
3.3.3예제 풀이
가로 3블록, 세로 2블록인 격자에서 표를 채워 집까지의 길의 수를 구하여라. 공사 중인 모퉁이(출발점에서 아래로 1칸, 오른쪽으로 1칸)를 지날 수 없다면 길은 몇 가지가 되는가?
맨 윗줄은 1, 1, 1, 1이다. 둘째 줄은 1, 2, 3, 4이고, 셋째 줄은 1, 3, 6, 10이다. 따라서 길은 10가지이며, \(\dbinom{5}{2} = 10\)과 같다.
공사 중인 모퉁이를 0으로 두고 다시 채우면, 둘째 줄은 1, 0, 1, 2이고, 셋째 줄은 1, 1, 2, 4이다. 따라서 길은 4가지로 준다. 조합 공식은 막힌 모퉁이가 있으면 바로 쓸 수 없지만, 표를 채우는 방법은 그 칸만 0으로 바꾸면 그대로 통한다. 즉 문제를 부분 문제로 나누어 두면 조건이 바뀌어도 쉽게 대응할 수 있다. 그래서 문제 분해는 공식을 모르는 문제를 푸는 일반적인 방법이 된다.
아래 탐구 카드에서 여러 문제의 부분 문제를 찾고, 그 답으로 전체 답을 만드는 식을 세워 보자.
- 파스칼의 삼각형은 파스칼보다 수백 년 앞서 중국의 양휘, 페르시아의 알카라지가 이미 알고 있었다. 각 수가 바로 위 두 수의 합이라는 규칙이 격자 경로의 점화식과 같다.
문제 분해는 큰 문제의 답을 같은 모양의 작은 문제들의 답으로 나타내는 일이며, 격자 경로에서는 각 모퉁이까지의 길의 수가 위와 왼쪽 모퉁이의 길의 수의 합이다. 부분 문제가 겹치지 않으면 분할 정복, 겹치면 표에 답을 적어 두는 동적 계획법으로 이어진다. 그래서 처음 질문의 10 × 10 동네에서 집까지 가는 길은 표 121칸을 채워 184756가지로 구할 수 있다.