더북(TheBook)

A 교차로에서 i행(1 ≤ i ≤ 4), j열(1 ≤ j ≤ 5) 교차로까지 갈 수 있는 최단 경로 개수를 P[i, j]라고 하자. 여기서 모든 최단 경로는 수평 방향으로는 오른쪽으로, 수직 방향으로는 아래로 이동하는 식으로 만들어진다. 따라서 A 교차로에서 시작해 i행, j열로 갈 수 있는 최단 경로 개수는 A에서 i - 1행, j열로 가는 최단 경로 개수(P[i - 1, j])와 A에서 i행, j - 1열로 가는 최단 경로 개수(P[i, j - 1])를 더한 값이 된다.

1 < i ≤ 4, 1 < j ≤ 5에 대해 P[i, j] = P[i - 1, j] + P[i, j - 1]

그리고 맨 윗 줄과 맨 왼쪽 열에 대해서는 다음과 같이 된다.

1 ≤ j ≤ 5에 대해 P[1, j] = 1, 1 ≤ i ≤ 4에 대해 P[i, 1] = 1

위의 식을 이용하면 첫째 줄에서 시작해 각 줄 안에서 오른쪽으로 가면서 줄 단위로 또는 첫 번째 열에서 시작해 각 열 안에서 아래로 가면서 열 단위로 P[i, j]를 계산할 수 있다.

이 문제는 조합을 활용해 풀 수도 있다. 모든 최단 경로는 수평 선분 네 개와 수직 선분 세 개로 이루어진다. 따라서 일곱 개의 선분 중에서 수직 선분 세 개를 뽑아내는 방법에 의해 서로 다른 경로가 결정된다. 따라서 최단 경로의 총 개수는 일곱 개 중에서 세 개를 뽑아내는 경우의 수, 즉 C(7, 3) = = 35다.8 이렇게 간단한 예제에서는 조합론을 이용한 풀이법이 동적 프로그래밍을 이용한 것보다 빠르지만 규칙성이 떨어지는 그리드에서 최단 경로 개수를 셀 때는 얘기가 달라진다. 막힌 경로 퍼즐(2.013)을 예로 풀어보자.

동적 프로그래밍을 적용하기 까다로울 때가 많지만 최대 합 내려가기(2.020), 동전 줍기(2.062)와 같은 비교적 간단한 예제를 풀어보자.

 

 


8 기본 조합론을 잘 안다면 아마도 P[i, j]의 값은 A 지점에서 시작해 남서쪽에서 북동쪽으로 대각선 방향으로 계산할 수도 있다는 것을 알 수 있을 것이다. 이 값들은 그 유명한 파스칼의 삼각형이라는 조합 구조를 그대로 따른다([Ros07] 및 Section 5.4 참조).

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.