Skip to content

Commit 21bfa4e

Browse files
committed
97번 알리바바와 40인의 도둑(Top-Down) 문제 수강 완료
1 parent 3b181fe commit 21bfa4e

1 file changed

Lines changed: 69 additions & 0 deletions

File tree

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
## 문제)
2+
알리바바는 40인의 도둑으로부터 금화를 훔쳐 도망치고 있습니다.
3+
알리바바는 도망치는 길에 평소에 잘 가지 않던 계곡의 돌다리로 도망가고자 한다.
4+
계곡의 돌다리는 N×N개의 돌들로 구성되어 있다. 각 돌다리들은 높이가 서로 다릅니다.
5+
해당 돌다리를 건널때 돌의 높이 만큼 에너지가 소비됩니다. 이동은 최단거리 이동을 합니다.
6+
즉 현재 지점에서 오른쪽 또는 아래쪽으로만 이동해야 합니다.
7+
N*N의 계곡의 돌다리 격자정보가 주어지면 (1, 1)격자에서 (N, N)까지 가는데 드는 에너지의
8+
최소량을 구하는 프로그램을 작성하세요.
9+
만약 N=3이고, 계곡의 돌다리 격자 정보가 다음과 같다면
10+
11+
(1, 1)좌표에서 (3, 3)좌표까지 가는데 드는 최소 에너지는 3+2+3+4+2=14이다.
12+
13+
### 입력 설명
14+
▣ 입력설명
15+
첫 번째 줄에는 자연수 N(1<=N<=20)이 주어진다.
16+
두 번째 줄부터 계곡의 N*N 격자의 돌다리 높이(10보다 작은 자연수) 정보가 주어진다.
17+
18+
### 출력 설명
19+
첫 번째 줄에 (1, 1)출발지에서 (N, N)도착지로 가기 위한 최소 에너지를 출력한다.
20+
21+
### 입력 예제
22+
5\
23+
3 7 2 1 9\
24+
5 8 3 9 2\
25+
5 3 1 2 3\
26+
5 4 3 2 1\
27+
1 7 5 2 4
28+
29+
30+
### 출력 예제
31+
25
32+
33+
### 모범 답안
34+
``` Cpp
35+
#include <iostream>
36+
#include <fstream>
37+
#include <vector>
38+
#include <algorithm>
39+
using namespace std;
40+
int arr[21][21], dy[21][21];
41+
42+
// DFS(x, y)의 의미
43+
// x,y까지 가는 데 들어가는 최소 에너지
44+
int DFS(int x, int y) {
45+
if (dy[x][y] > 0) return dy[x][y];
46+
if (x == 0 && y == 0) return arr[0][0];
47+
else {
48+
if (y == 0) return dy[x][y] = DFS(x - 1, y) + arr[x][y];
49+
else if (x == 0) return dy[x][y] = DFS(x, y - 1) + arr[x][y];
50+
else return dy[x][y] = min(DFS(x - 1, y), DFS(x, y - 1)) + arr[x][y];
51+
}
52+
}
53+
54+
int main() {
55+
ios_base::sync_with_stdio(false);
56+
ifstream cin;
57+
cin.open("input.txt");
58+
int n = 0, cnt = 0;
59+
cin >> n;
60+
for (int i = 0; i < n; i++) {
61+
for (int j = 0; j < n; j++) {
62+
cin >> arr[i][j];
63+
}
64+
}
65+
// Top Down 방식이기 때문에 도착지점부터 DFS 시작
66+
cout << DFS(n - 1, n - 1);
67+
return 0;
68+
}
69+
```

0 commit comments

Comments
 (0)