it 취업을 위한 알고리즘 문제풀이 입문 : 알리바바와 40인의 도둑(Bottom-Up)
🙇♀️알리바바와 40인의 도둑(Bottom-Up)
알리바바는 40인의 도둑으로부터 금화를 훔쳐 도망치고 있습니다.
알리바바는 도망치는 길에 평소에 잘 가지 않던 계곡의 돌다리로 도망가고자 한다.
계곡의 돌다리는 N×N개의 돌들로 구성되어 있다. 각 돌다리들은 높이가 서로 다릅니다.
해당 돌다리를 건널때 돌의 높이 만큼 에너지가 소비됩니다. 이동은 최단거리 이동을 합니다.
즉 현재 지점에서 오른쪽 또는 아래쪽으로만 이동해야 합니다.
N*N의 계곡의 돌다리 격자정보가 주어지면 (1, 1)격자에서 (N, N)까지 가는데 드는 에너지의 최소량을 구하는 프로그램을 작성하세요.
만약 N=3이고, 계곡의 돌다리 격자 정보가 다음과 같다면
3 3 5
2 3 4
6 5 2
(1, 1)좌표에서 (3, 3)좌표까지 가는데 드는 최소 에너지는 3+2+3+4+2=14이다.
▣ 입력설명
첫 번째 줄에는 자연수 N(1<=N<=20)이 주어진다.
두 번째 줄부터 계곡의 N*N 격자의 돌다리 높이(10보다 작은 자연수) 정보가 주어진다.
▣ 출력설명
첫 번째 줄에 (1, 1)출발지에서 (N, N)도착지로 가기 위한 최소 에너지를 출력한다.
▣ 입력예제 1
5
3 7 2 1 9
5 8 3 9 2
5 3 1 2 3
5 4 3 2 1
1 7 5 2 4
▣ 출력예제 1
25
🚀풀이
동적 계획법 문제이다.
dp의 값은 그 위치로 도달하는 최소 코스트를 나타낸다.
해당 위치에서 위의 dp값, 왼쪽의 dp값을 비교해서 작은 값을 택하고 자기 자신의 코스트를 더해주면 해당위치 dp값이 된다.
dp[y][x] = board[y][x] + min(dp[y - 1][x], dp[y][x - 1]);
맨 윗줄과 왼쪽줄은 처음에 바로 dp값을 넣어줘야한다.
dp[i][1] = dp[i - 1][1] + board[i][1];
dp[1][i] = dp[1][i - 1] + board[1][i];
void solve()
{
dp[1][1] = board[1][1];
for (int i = 2; i <= n; ++i)
{
dp[i][1] = dp[i - 1][1] + board[i][1];
dp[1][i] = dp[1][i - 1] + board[1][i];
}
for (int y = 2; y <= n; ++y)
{
for (int x = 2; x <= n; ++x)
{
dp[y][x] = board[y][x] + min(dp[y - 1][x], dp[y][x - 1]);
}
}
cout << dp[n][n];
}
🚀전체 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
vector<vector<int>> board, dp;
void setting()
{
cin >> n;
board = vector<vector<int>>(n + 1, vector<int>(n + 1));
dp = vector<vector<int>>(n + 1, vector<int>(n + 1, 123456789));
for (int y = 1; y <= n; ++y)
for (int x = 1; x <= n; ++x)
{
cin >> board[y][x];
}
}
void solve()
{
dp[1][1] = board[1][1];
for (int i = 2; i <= n; ++i)
{
dp[i][1] = dp[i - 1][1] + board[i][1];
dp[1][i] = dp[1][i - 1] + board[1][i];
}
for (int y = 2; y <= n; ++y)
{
for (int x = 2; x <= n; ++x)
{
dp[y][x] = board[y][x] + min(dp[y - 1][x], dp[y][x - 1]);
}
}
cout << dp[n][n];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}