ㅎr....
dp는 왤케 어려운걸까..
머리가 돌아가지 않는다아...
이 문제 딱 보는 순간
dfs 문제라는 걸 직감하였디!
그래도 문제 풀면 풀수록
나아지는 게 느껴져서 행복하다..
(물론 아직 갈길이 멀긴 하지만!)
이 문제는
처음부터 이해를 잘못했었다..
역시 나답다 ^_^
현재 높이보다 작은 곳으로 이동하는건데
가장 작은 높이들만 찾아서 이동하는 건줄 알았다 ^0^..
예시를 가지고 풀이 시작!
총 3가지의 경우의 수가 있다!
1번째 경로
50 -> 45 -> 37 -> 20 -> 17 -> 15 -> 10
0 | 0 | 0 | 1 | 1 |
-1 | -1 | -1 | 1 | 1 |
-1 | -1 | -1 | 1 | -1 |
-1 | -1 | -1 | 1 | -1 |
2번째 경로
50 -> 45 -> 37 -> 32 -> 20 -> 17 -> 15 -> 10
2 | 2 | 2 | 2 | 1 |
-1 | -1 | -1 | 1 | 1 |
-1 | -1 | -1 | 1 | -1 |
-1 | -1 | -1 | 1 | -1 |
3번째 경로
50 -> 35 -> 30 -> 27 -> 24 -> 22 -> 15 -> 10
3 | 2 | 2 | 2 | 1 |
1 | -1 | -1 | 1 | 1 |
1 | -1 | -1 | 1 | -1 |
1 | 1 | 1 | 1 | -1 |
n, m = map(int, input().split())
array = [list(map(int, input().split())) for _ in range(n)]
visited = [[-1 for _ in range(m)] for _ in range(n)]
# 상,우,하,좌
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
# 항상 지금의 높이보다 높이가 더 낮은 지점으로만 이동한다.
# 항상 내리막길로만 이동하는 경로의 수를 구하라
answer = 0
# 맨 오른쪽 좌표 : n-1, m-1
def dfs(x, y):
global answer
if x == n - 1 and y == m - 1:
return 1
if visited[x][y] != -1:
return visited[x][y]
visited[x][y] = 0 # 현재 위치 방문처리 과정
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
# 맵 안에 있는 경우
if array[nx][ny] < array[x][y]:
visited[x][y] += dfs(nx, ny)
print(visited)
return visited[x][y]
print(dfs(0, 0))
'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글
[스프링 핵심 원리 이해 1] 회원 도메인 설계 및 개발 (0) | 2022.01.09 |
---|---|
[14499] 주사위 굴리기 in python (0) | 2022.01.09 |
[1309] 동물원 in python (0) | 2022.01.08 |
[2644] 촌수 계산하기 in python (0) | 2022.01.08 |
[10451] 순열 사이클 in python (0) | 2022.01.06 |