Skip to content

Commit 2663375

Browse files
committed
[Gold III] Title: 내리막 길, Time: 332 ms, Memory: 35688 KB -BaekjoonHub
1 parent fa91ec8 commit 2663375

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold III] 내리막 길 - 1520
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1520)
4+
5+
### 성능 요약
6+
7+
메모리: 35688 KB, 시간: 332 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 깊이 우선 탐색, 격자 그래프
12+
13+
### 제출 일자
14+
15+
2025년 7월 15일 22:19:55
16+
17+
### 문제 설명
18+
19+
<p>여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으며, 각 지점 사이의 이동은 지도에서 상하좌우 이웃한 곳끼리만 가능하다.</p>
20+
21+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/0e11f3db-35d2-4b01-9aa0-9a39252f05be/-/preview/" style="width: 151px; height: 122px;"></p>
22+
23+
<p>현재 제일 왼쪽 위 칸이 나타내는 지점에 있는 세준이는 제일 오른쪽 아래 칸이 나타내는 지점으로 가려고 한다. 그런데 가능한 힘을 적게 들이고 싶어 항상 높이가 더 낮은 지점으로만 이동하여 목표 지점까지 가고자 한다. 위와 같은 지도에서는 다음과 같은 세 가지 경로가 가능하다.</p>
24+
25+
<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>
26+
27+
<p>지도가 주어질 때 이와 같이 제일 왼쪽 위 지점에서 출발하여 제일 오른쪽 아래 지점까지 항상 내리막길로만 이동하는 경로의 개수를 구하는 프로그램을 작성하시오.</p>
28+
29+
### 입력
30+
31+
<p>첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. M과 N은 각각 500이하의 자연수이고, 각 지점의 높이는 10000이하의 자연수이다.</p>
32+
33+
### 출력
34+
35+
<p>첫째 줄에 이동 가능한 경로의 수 H를 출력한다. 모든 입력에 대하여 H는 10억 이하의 음이 아닌 정수이다.</p>
36+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.math.BigInteger;
4+
import java.io.IOException;
5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
import java.util.Comparator;
8+
import java.util.HashSet;
9+
import java.util.List;
10+
import java.util.PriorityQueue;
11+
import java.util.Set;
12+
import java.util.StringTokenizer;
13+
14+
class Main {
15+
16+
static int N,M, arr[][], dp[][];
17+
18+
static int dx[] = { -1,1,0,0};
19+
static int dy[] = { 0,0,-1,1};
20+
public static void main(String[] args) throws IOException {
21+
22+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
23+
24+
StringTokenizer st = new StringTokenizer(br.readLine());
25+
26+
N = Integer.parseInt(st.nextToken());
27+
28+
M = Integer.parseInt(st.nextToken());
29+
30+
arr = new int[N+1][M+1];
31+
dp = new int[N+1][M+1];
32+
33+
for(int i =1; i<=N; i++) {
34+
st = new StringTokenizer(br.readLine());
35+
for(int j =1; j<=M; j++) {
36+
arr[i][j] = Integer.parseInt(st.nextToken());
37+
dp[i][j] = -1;
38+
}
39+
}
40+
System.out.println(dfs(1, 1));
41+
}
42+
43+
static int dfs(int x, int y) {
44+
if(x == N && y ==M) {
45+
return 1;
46+
}
47+
48+
if(dp[x][y] != -1) {
49+
return dp[x][y];
50+
}
51+
52+
dp[x][y] = 0;
53+
54+
for(int i =0; i<4; i++) {
55+
int nowx = x + dx[i];
56+
int nowy = y + dy[i];
57+
58+
if(nowx < 1 || nowy < 1 || nowx >N || nowy >M) {
59+
continue;
60+
}
61+
62+
if(arr[x][y] > arr[nowx][nowy]) {
63+
dp[x][y] += dfs(nowx, nowy);
64+
}
65+
}
66+
67+
return dp[x][y];
68+
69+
}
70+
}

0 commit comments

Comments
 (0)