[프로그래머스] 등굣길
[프로그래머스] 등굣길
문제
링크 : 프로그래머스
풀이
이 문제는 일정한 일반적인 dp문제와 마찬가지로 작은 해들의 합이 곧 최단 경로가 되는 문제이다.
결국 2차원 dp를 만들어서 (1,1) 에서 1로 시작해서
좌측, 상측의 dp값을 더해 최단거리를 만들어주면 된다.
어릴 때 했던 최단거리 문제와 같다.
여기서 주의할 점은,, 좌표값이다 ! 문제에 나오는 좌표값이 코드에서 작성할 때와는 반대이기 때문이다!
그림 그리면서 잘 생각해야 한다.
def solution(m, n, puddles):
answer = 0
dp = [[0] * (m+1) for _ in range(n+1)] # for문 빼먹지 말자.
for i in range(1, n+1):
for j in range(1, m+1):
# 좌표 값 잘보자. n은 y축(코드에선 x), m은 x축 (코드에선 y)
if i == 1 and j == 1:
dp[i][j] = 1
continue
if [j, i] in puddles: # 좌표값 위치, 물웅덩이 갯수 (문제파악)
continue
else:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[n][m] % 1000000007
# 좌표값 위치, 1000000007 로 나눈 나머지는 효율성 검사 의심
실수 및 배운 점
-
실수했던 점이 너무 많아서 정말 내 자신이 미울 정도이다. 점화식도 다 구했고 모든 걸 다 해결했다고 생각했는데
결국 문제를 제대로 파악하지 않아서 생겼던 문제가 나왔다.-
좌표값
좌표값이 문제와 반대로 나와있다. 그래서 결과값을 구하는 데 자꾸 반대로 써서 index error 가 났다.
puddles의 좌표도 마찬가지로 반대로 검사했다. -
puddles 개수
puddles가 한 개만 있는 줄 알고 좌표 값을 그대로 대입 시켰다.
파이썬의 특징을 이용하자..
if [j,i] in puddles:
-
1000000007 로 나눈 나머지
dp에서 자주 있는 문제이다. 루프 안에 나머지를 찾지 말고 답에서 찾아서 효율성을 얻자. -
for문
가장 기본적인 문제이다. 2차원 배열을 만들 때! list comprehension 제대로 쓰자.n = [[0] * m for _ in range(n)]
-