Skip to content

Commit

Permalink
[Gold III] Title: 내리막 길, Time: 116 ms, Memory: 47892 KB -BaekjoonHub
Browse files Browse the repository at this point in the history
  • Loading branch information
hocheol0303 committed Jan 5, 2025
1 parent c5d236f commit 472f136
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 0 deletions.
36 changes: 36 additions & 0 deletions 백준/Gold/1520. 내리막 길/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# [Gold III] 내리막 길 - 1520

[문제 링크](https://www.acmicpc.net/problem/1520)

### 성능 요약

메모리: 47892 KB, 시간: 116 ms

### 분류

깊이 우선 탐색, 다이나믹 프로그래밍, 그래프 이론, 그래프 탐색

### 제출 일자

2025년 1월 6일 08:54:07

### 문제 설명

<p>여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으며, 각 지점 사이의 이동은 지도에서 상하좌우 이웃한 곳끼리만 가능하다.</p>

<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/0e11f3db-35d2-4b01-9aa0-9a39252f05be/-/preview/" style="width: 151px; height: 122px;"></p>

<p>현재 제일 왼쪽 위 칸이 나타내는 지점에 있는 세준이는 제일 오른쪽 아래 칸이 나타내는 지점으로 가려고 한다. 그런데 가능한 힘을 적게 들이고 싶어 항상 높이가 더 낮은 지점으로만 이동하여 목표 지점까지 가고자 한다. 위와 같은 지도에서는 다음과 같은 세 가지 경로가 가능하다.</p>

<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/917d0418-35db-4081-9f62-69a2cc78721e/-/preview/" style="width: 151px; height: 123px;"> <img alt="" src="https://upload.acmicpc.net/1ed5b78d-a4a1-49c0-8c23-12a12e2937e1/-/preview/" style="width: 151px; height: 121px;"> <img alt="" src="https://upload.acmicpc.net/e57e7ef0-cc56-4340-ba5f-b22af1789f63/-/preview/" style="width: 151px; height: 121px;"></p>

<p>지도가 주어질 때 이와 같이 제일 왼쪽 위 지점에서 출발하여 제일 오른쪽 아래 지점까지 항상 내리막길로만 이동하는 경로의 개수를 구하는 프로그램을 작성하시오.</p>

### 입력

<p>첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. M과 N은 각각 500이하의 자연수이고, 각 지점의 높이는 10000이하의 자연수이다.</p>

### 출력

<p>첫째 줄에 이동 가능한 경로의 수 H를 출력한다. 모든 입력에 대하여 H는 10억 이하의 음이 아닌 정수이다.</p>

50 changes: 50 additions & 0 deletions 백준/Gold/1520. 내리막 길/내리막 길.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
'''
컨닝:
해당 자리에서 끝까지 갈 수 있는 경우의 수 저장해서 중복되는 경로는 스킵할 수 있게하기
재귀함수의 리턴값을 활용해야함
풀어도 풀은게 아니야..
'''

import sys
sys.setrecursionlimit(10**6)

def dfs(row, col):
global MAP, dp, n, m
d_row = [-1,1,0,0]
d_col = [0,0,-1,1]

if row == n-1 and col == m-1:
return 1
elif dp[row][col] != -1:
# 방문한 적이 있는 경로면 해당 자리가 가지고 있는 경우의 수를 리턴함으로써 중복 계산 단축
return dp[row][col]

# visited 계념으로 -1은 탐색한 적 없는, 0은 경우의 수가 0
dp[row][col] = 0

for i in range(4):
n_row, n_col = row+d_row[i], col+d_col[i]
if 0<=n_row<n and 0<=n_col<m:
if MAP[n_row][n_col] < MAP[row][col]:
dp[row][col] += dfs(n_row, n_col)

return dp[row][col]


n, m = map(int, sys.stdin.readline().split())
MAP = []
dp = [[-1]*m for _ in range(n)]

for _ in range(n):
MAP.append(list(map(int, sys.stdin.readline().split())))

# for i in MAP:
# print(i)

dfs(0,0)

# for i in dp:
# print(i)

print(dp[0][0])

0 comments on commit 472f136

Please sign in to comment.