나의 풀이
def solution(m, n, puddles):
dp = [[0]*(m+1) for _ in range(n+1)]
print(dp)
for i in range(1, n+1) :
for j in range(1, m+1) :
if i == 1 and j == 1 :
dp[i][j] = 1
elif [j,i] in puddles :
dp[i][j] = 0
else :
dp[i][j] = dp[i-1][j] + dp[i][j-1]
# print("dp[{}][{}] = {}".format(i,j,dp[i][j]))
return dp[n][m] % 1000000007
- (1,1) 을 집으로, (n,m) 을 학교 좌표로 만들기 위해, 이차원 배열을 [n+1][m+1] 의 크기로 초기화한다.
- 이번 문제는 최소 경로의 길이를 구하는 것이 아니라, 최소 경로의 개수를 구하는 것이다.
- 문제에서는 항상 오른쪽 혹은 아래쪽으로만 이동한다고 하였는데, 이는 어떻게 가더라도 항상 최단 경로로 이동하는 것이다.
- 따라서 현재 위치까지 올 수 있는 경우의 수를 구하면 된다.
- 즉, dp[x][y] = dp[x-1][y] + dp[x][y-1] 을 뜻한다.
- 현재 위치 까지 올 수 있는 경우의 수는, 현재 위치의 위쪽까지 오는 방법 + 현재 위치의 왼쪽까지 오는 방법과 같다.
- 만약, 물웅덩이 좌표에 도착한다면, 해당 좌표에는 도달할 수 없게 하기 위해 dp[x][y] = 0 으로 할당한다.
* puddles 안에 있는 물웅덩이의 좌표는 (y,x) 로 표기되어 있다....
처음에 다 맞게 푼 것 같은데 테스트케이스 1개 빼고 다 틀려서 당황함...ㅎㅎ
따라서 [j,i] in puddles 로 y,x 좌표를 바꿔주어야한다.
m=4, n=3 의 위 테스트케이스에 대한 dp[] 는 다음과 같다.
'알고리즘 > 동적프로그래밍(DP)' 카테고리의 다른 글
[프로그래머스] 사칙연산 - 파이썬(python) (0) | 2022.09.20 |
---|---|
[프로그래머스] 도둑질 - 파이썬(python) (0) | 2022.09.19 |
[프로그래머스] 정수 삼각형 - 파이썬(python) (0) | 2022.09.17 |
[프로그래머스] N으로 표현 - 파이썬(python) (0) | 2022.09.17 |
[Python] 백준 11052번: 카드 구매하기 풀이 (0) | 2021.02.04 |
댓글