BOJ
[BOJ 4485 // C++] 녹색 옷 입은 애가 젤다지?
measurezero
2021. 4. 6. 10:00
※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 4485번 문제인 녹색 옷 입은 애가 젤다지?이다.
문제는 아래 링크를 확인하자.
4485번: 녹색 옷 입은 애가 젤다지?
젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주
www.acmicpc.net
이 문제에서는 주어진 2차원 배열에서 지나가는 칸의 수의 합이 최소가 되는 경로를 찾는 문제이다.
이 문제는 2차원 배열 모양의 그래프에서 최단거리가 되는 경로를 찾는 문제로 볼 수 있으므로, dijkstra 알고리즘을 사용하면 간단히 문제를 풀 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <queue>
#include <vector>
using std::cin; using std::cout;
using std::pair;
using std::priority_queue;
int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };
int num = 0;
void solve(int N) {
int cave[125][125];
bool visited[125][125];
for (int i = 0;i < N;i++) {
for (int j = 0;j < N;j++) {
int temp; cin >> temp;
cave[i][j] = temp;
visited[i][j] = false;
}
}
priority_queue<pair<int, pair<int,int>>> pq; // {dist,{row,column}}
pair<int, int> pair00 = { 0,0 };
pair<int, int> pairnn = { N - 1,N - 1 };
pq.push({ -cave[0][0],pair00 });
pair<int, int> current = { 0,0 };
while (!pq.empty()) {
current = pq.top().second;
int dist = -pq.top().first; pq.pop();
if (visited[current.first][current.second]) continue;
if (current.first == N - 1 and current.second == N - 1) {
cout << "Problem " << num << ": " << dist << '\n';
break;
}
visited[current.first][current.second] = 1;
for (int i = 0;i < 4;i++) {
int rr = current.first + dr[i];
int cc = current.second + dc[i];
if (0 <= rr && rr < N && 0 <= cc && cc < N) {
if (!visited[rr][cc]) {
pq.push({ -dist - cave[rr][cc],{rr,cc} });
}
}
}
}
}
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
int N; cin >> N;
while (N != 0) {
num++;
solve(N);
cin >> N;
}
return 0;
}
728x90