Note
m×n 그리드에서 왼쪽 위에서 오른쪽 아래로, 오른쪽 또는 아래로만 이동할 때 가능한 서로 다른 경로의 개수를 구하는 문제입니다. 동적 프로그래밍(DP)과 조합론(Combinatorics) 두 가지 방식으로 접근할 수 있습니다.
문제 링크
알고리즘 이론: 그리드 경로 개수 세기
1. 동적 프로그래밍 (Dynamic Programming) 방식
어떤 칸 에 도달하는 경로 수를 구할 때, 이동 규칙(오른쪽 또는 아래)에 따라 로 오는 방법은 단 두 가지뿐입니다:
- 왼쪽 에서 오른쪽으로 한 칸 이동
- 위 에서 아래로 한 칸 이동
점화식
dp[y][x]: 에서 까지 도달하는 서로 다른 경로의 개수
초기 조건
- 첫 번째 행 : 왼쪽에서만 올 수 있으므로 모두 1 (
dp[0][x] = 1) - 첫 번째 열 : 위에서만 올 수 있으므로 모두 1 (
dp[y][0] = 1)
2. 조합론 (Combinatorics) 방식
로봇이 칸에 도착하기 위해서는:
- **오른쪽(Right)**으로 총 번 이동해야 함
- **아래(Down)**로 총 번 이동해야 함
즉, 전체 이동 횟수는 번이며, 이 중 아래로 이동할 번의 타이밍을 결정하는 조합의 수와 같습니다.
공식
수학적으로는 이 조합 공식 한 번으로 답을 구할 수 있으며, DP 방식은 각 칸까지의 경로 수를 단계적으로 채워나가는 방식입니다.
코드 구현 (DP 방식)
전체 코드
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
# 1. DP 테이블 생성 (m x n)
grid = [[0 for _ in range(n)] for _ in range(m)]
# 2. 첫 번째 열과 행 초기화 (경계 조건)
for y in range(m):
grid[y][0] = 1
for x in range(n):
grid[0][x] = 1
# 3. 점화식을 이용해 나머지 칸 채우기
for y in range(1, m):
for x in range(1, n):
grid[y][x] = grid[y - 1][x] + grid[y][x - 1]
# 4. 도착 지점의 경로 수 반환
return grid[m - 1][n - 1]시간 및 공간 복잡도
DP 방식
- 시간 복잡도: — 그리드의 모든 칸을 한 번씩 방문합니다.
- 공간 복잡도: — 2차원 DP 테이블을 사용합니다. (현재 행만 유지하는 방식으로 까지 최적화 가능)
조합론 방식
- 시간 복잡도: — 조합 값을 계산하는 데 걸리는 시간입니다.
- 공간 복잡도: — 추가적인 공간이 거의 필요하지 않습니다.
관련 알고리즘
- 동적 프로그래밍 (Dynamic Programming)
- 조합론 (Combinatorics)