|
| 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 | +int main() { |
| 42 | + ios_base::sync_with_stdio(false); |
| 43 | + ifstream cin; |
| 44 | + cin.open("input.txt"); |
| 45 | + int n = 0, cnt = 0; |
| 46 | + cin >> n; |
| 47 | + for (int i = 0; i < n; i++) { |
| 48 | + for (int j = 0; j < n; j++) { |
| 49 | + cin >> arr[i][j]; |
| 50 | + } |
| 51 | + } |
| 52 | + dy[0][0] = arr[0][0]; |
| 53 | + for (int i = 0; i < n; i++) { |
| 54 | + // 0번째 열의 경우 현재 dy의 값은 바로 왼쪽에 있는 dy값 + 현재 arr 값 |
| 55 | + dy[0][i] = dy[0][i - 1] + arr[0][i]; |
| 56 | + // 0번째 행의 경우 현재 dy의 값은 바로 위쪽에 있는 dy값 + 현재 arr 값 |
| 57 | + dy[i][0] = dy[i - 1][0] + arr[i][0]; |
| 58 | + } |
| 59 | + for (int i = 1; i < n; i++) { |
| 60 | + for (int j = 1; j < n; j++) { |
| 61 | + // dy(i,j) 좌표에 있는 값은 dy의 위쪽 또는 왼쪽에 있는 값 중 작은 값 + 현재 arr(i, j) 값 |
| 62 | + dy[i][j] = min(dy[i - 1][j], dy[i][j - 1]) + arr[i][j]; |
| 63 | + } |
| 64 | + } |
| 65 | + cout << dy[n - 1][n - 1]; |
| 66 | + return 0; |
| 67 | +} |
| 68 | + |
| 69 | +// dy[i][j]의 의미는 출발좌표(0,0)에서 (i,j)까지 가는 데 들어가는 최소 비용 |
| 70 | + |
| 71 | +``` |
0 commit comments