https://www.acmicpc.net/problem/1520
1520번: 내리막 길
첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다.
www.acmicpc.net
생각한 풀이과정
- DFS와 DP(코드 내
visited함수)를 사용하여 해결한 문제 - 항상 높이가 낮은 지점으로 간다는 말에 초점을 맞춰야 함
- 마지막 지점 도달할 경우 return
1= 실행대기중인 함수들을 통한 경로 개수 증가
제출 시 주의사항
- 생각보다 재귀를 많이 돈다.
sys.setrecursionlimit사용
import sys
sys.setrecursionlimit(100000)
n, m = map(int, sys.stdin.readline().split())
maps = []
for i in range(n) :
maps.append(list(map(int, sys.stdin.readline().split())))
visited = [[-1] * m for _ in range(n)]
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def dfs(x, y) :
# 제일 오른쪽 아래 지점까지 항상 내리막길로만 이동
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 nx >= 0 and nx < n and ny >= 0 and ny < m :
if maps[x][y] > maps[nx][ny] : # 항상 높이가 더 낮은 지점으로만 이동
visited[x][y] += dfs(nx, ny)
return visited[x][y]
# 제일 왼쪽 위 지점에서 출발
print(dfs(0,0))
'코딩 > 코테대비' 카테고리의 다른 글
| [Baekjoon] 7569번 토마토 / Python (0) | 2022.01.18 |
|---|---|
| [Baekjoon] 15686번 치킨배달 / Python (0) | 2022.01.11 |
| [Programmers] 광고 삽입(Level 3) / Python (0) | 2021.12.28 |