우노
[DP] 백준 10164번 “격자상의 경로” Python 풀이 본문
문제 링크
풀이

- 학창 시절에 배웠던 경로 찾기 방법을 사용하면 됩니다.
- 만약, (0, 0) 칸부터 (N-1, M-1) 칸까지의 경로를 찾는다면,
- 첫 행과 첫 열을 1로 채운 뒤,
- 빈 칸을 왼쪽 칸과 위쪽 칸의 덧셈 결과로 채워주면 됩니다.
- 따라서, 해당 방법을 사용해, 시작 지점에서 중간 지점까지의 경로를 구하고 중간 지점에서 마지막 지점까지의 경로를 구한 뒤, 두 값을 곱해주면 됩니다.
코드
import sys
# 격자의 행의 수 n과 열의 수 m, ○로 표시된 칸의 번호
n, m, k = map(int, sys.stdin.readline().split())
# 경로 저장용 DP 테이블
graph = [[0]*m for _ in range(n)]
# 경로 결과
result = 1
# ○로 표시된 칸이 없다면
if (k == 0):
# 1번 칸부터 NxM번 칸의 경로 탐색
for i in range(n):
for j in range(m):
# 첫 행 및 첫 열이라면 경로를 1로 할당
if (i==0 or j==0):
graph[i][j] = 1
# 나머지는 왼쪽 칸과 위쪽 칸의 덧셈 결과로 경로를 할당
else:
graph[i][j] = graph[i][j-1] + graph[i-1][j]
# 경로 결과
result *= graph[n-1][m-1]
# ○로 표시된 칸이 있다면
else:
# 중간지점
middle_x = (k-1) // m
middle_y = (k-1) % m
# 1번 칸부터 중간 지점까지의 경로 탐색
for i in range(middle_x + 1):
for j in range(middle_y + 1):
# 첫 행 및 첫 열이라면 경로를 1로 할당
if (i==0 or j==0):
graph[i][j] = 1
# 나머지는 왼쪽 칸과 위쪽 칸의 덧셈 결과로 경로를 할당
else:
graph[i][j] = graph[i][j-1] + graph[i-1][j]
# 1번 칸부터 중간 지점까지의 경로 탐색 결과
result *= graph[middle_x][middle_y]
# 중간 지점부터 NxM번 칸까지의 경로 탐색
for i in range(middle_x, n):
for j in range(middle_y, m):
# 중간 지점의 행 및 열 경로를 1로 할당
if (i==middle_x or j==middle_y):
graph[i][j] = 1
# 나머지는 왼쪽 칸과 위쪽 칸의 덧셈 결과로 경로를 할당
else:
graph[i][j] = graph[i][j-1] + graph[i-1][j]
# 경로 결과
result *= graph[n-1][m-1]
print(result)
참고
'Algorithm > Dynamic Programming' 카테고리의 다른 글
[DP] 백준 7579번 “앱” Python 풀이 (0) | 2022.10.13 |
---|---|
[DP] 백준 10942번 “팰린드롬?” Python 풀이 (1) | 2022.10.12 |
[DP] 백준 11726번 “2xn 타일링” Python 풀이 (0) | 2022.10.10 |
[DP] 이코테 “편집 거리” Python 풀이 (0) | 2022.09.21 |
[DP] 이코테 “못생긴 수” Python 풀이 (0) | 2022.09.21 |