728x90
1520. 내리막 길
난이도 : 골드 3
소요 시간 : 20분
날짜 : 2025.01.09
언어 : 파이썬
알고리즘 유형 : dp, bfs
설명 보기전에 문제 풀어보러 가기
1. 문제 설명
- 높이가 담겨있는 그래프가 주어진다.
- 내리막길로만 이동해서 1,1부터 m,n까지 이동하는 경우의 수를 구하기
2. 해결 방식
- dp[i][j] : i,j에서의 이동가능한 경우의 수
- 거꾸로 탐색하여 dp값을 채운다.
- 재귀함수 : sol(x,y)
- x,y : 현재 위치
- x,y가 -1이 아니면 방문한 경우이므로, 종료
- dp의 값을 0으로 초기화 시킨 후, 다음 방문 가능지역의 dp값을 더해준다.
- 결과적으로 재귀함수의 특성때문에, 끝점부터 세는 구현방식이 된다.
3. 정답 코드
import sys;input=sys.stdin.readline
sys.setrecursionlimit(100000)
m, n = map(int, input().split())
heights = [list(map(int, input().split())) for _ in range(m)]
dp = [[-1] * n for _ in range(m)]
direction = [(1, 0), (0, 1), (-1, 0), (0, -1)]
def sol(x=0, y=0):
if (x, y) == (m - 1, n - 1):return 1
if dp[x][y] != -1:return dp[x][y]
dp[x][y] = 0
for dx, dy in direction:
nx, ny = x + dx, y + dy
if nx in range(m) and ny in range(n):
if heights[nx][ny] < heights[x][y]:
dp[x][y] += sol(nx, ny)
return dp[x][y]
print(sol())
반응형
'백준 문제풀이 코드저장소 > Gold' 카테고리의 다른 글
Baekjoon 9997. 폰트 / Python (0) | 2025.01.10 |
---|---|
Baekjoon 2629. 양팔저울 / Python (0) | 2025.01.09 |
Baekjoon 2293. 동전 1 / Python (0) | 2025.01.09 |
Baekjoon 11066. 파일 합치기 / Python (0) | 2025.01.09 |