-
반응형
4485번 녹색 옷 입은 애가 젤다지?
4485번: 녹색 옷 입은 애가 젤다지?
젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주
www.acmicpc.net
풀이)
다익스트라 알고리즘을 통해 (0,0) 부터 (N-1,N-1)까지 최소한의 검정루피를 얻는 경로를 구해주면된다.
시간복잡도)
시간복잡도는 최악의 경우 모든 x,y좌표를 큐에 넣고 연산하는 작업을 해야하므로 O(N*N) 이 된다.
코드)
#include <iostream> #include<queue> #define MAX 987654321 using namespace std; int n; int arr[126][126]; int dist[126][126]; int mv[4][2] = { {1,0},{-1,0},{0,-1},{0,1} }; void input() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> arr[i][j]; } } } int solve() { priority_queue<pair<int,pair<int, int>>> q; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { dist[i][j] = MAX; } } dist[0][0] = arr[0][0]; q.push({ -dist[0][0],{0,0} }); while (!q.empty()) { int x = q.top().second.first; int y = q.top().second.second; int distance = -q.top().first; q.pop(); for (int i = 0; i < 4; i++) { int nx = x + mv[i][0]; int ny = y + mv[i][1]; if (nx >= 0 && nx < n&&ny >= 0 && ny < n) { if (dist[nx][ny] > distance + arr[nx][ny]) { q.push({ -(distance + arr[nx][ny]),{nx,ny} }); dist[nx][ny] = distance + arr[nx][ny]; } } } } return dist[n-1][n-1]; } int main(){ int i = 1; while (true) { cin >> n; if (n == 0) break; input(); int result=solve(); cout << "Problem " << i++ << ": " << result << "\n"; } return 0; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준oj] 18427번 함께 블록 쌓기 (0) 2021.03.06 [백준oj] 1600번 말이 되고픈 원숭이 (0) 2021.03.03 [백준oj] 1504번 특정한 최단 경로 (0) 2021.01.10 [백준oj] 1238번 파티 (0) 2021.01.10 [백준oj] 1946번 신입 사원 (0) 2020.12.31 댓글