Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- AWS
- 다익스트라
- BOJ 2167
- BOJ 4948
- BOJ 1697
- javascript
- BOJ 4485
- BOJ 5791
- spring security
- 조합 알고리즘
- 분할과 정복
- BOJ 2234
- BOJ 2146
- springboot
- BOJ 6593
- BOJ 1926
- BOJ 1074
- serverless
- BOJ 11726
- BOJ 1912
- BOJ 2407
- Lambda
- BOJ 2213
- 플로이드 와샬
- Coercion
- DP
- BOJ 2012
- MySQL
- BOJ 5568
- priority_queue
Archives
- Today
- Total
고인물을 지양하는 블로그
BOJ 4485 녹색 옷 입은 애가 젤다지? 본문
https://www.acmicpc.net/problem/4485
4485번: 녹색 옷 입은 애가 젤다지?
문제 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주인공, 링크는 지금 도둑루피만 가득한 N x N 크기의 동굴의 제일 왼쪽 위에 있다. [0][0]번 칸이기도 하다. 왜 이런 곳에 들어왔냐고 묻는다면 밖에서 사람들이 자꾸 "젤다의 전설에 나오는 녹색 애가 젤다지?"라고 물어봤기 때문이다. 링크가 녹색 옷을 입
www.acmicpc.net
#include <iostream>
#include <queue>
struct Edge {int x,y,w;
bool operator<(const Edge& a) const { return w > a.w; } // Edge 크기 비교는 가중치로
Edge() = default;
Edge(int x, int y, int w) : x(x),y(y),w(w) {}
};
int N, dx[] = {0,1,0,-1}, dy[] = {1,0,-1,0};
using namespace std;
bool bound(Edge a) {return a.x>=0&&a.x<N&&a.y>=0&&a.y<N;}
int bfs(int G[][125], int d[][125]) {
priority_queue<Edge> PQ;
d[0][0] = 0; // 시작 정점까지의 거리를 0으로
PQ.push({0,0,0});
while(!PQ.empty()) {
Edge u = PQ.top();
PQ.pop();
if(d[u.y][u.x] < u.w) continue;
// 시작 정점에서 방문하는 정점까지의 거리가 인접한 정점에서 방문하는 거리보다 작으면 업데이트 x
for(int i=0;i<4;++i) { // 인접한 정점까지의 거리 업데이트
int nx = u.x + dx[i], ny = u.y + dy[i];
Edge adj = {nx,ny,G[nx][ny] + u.w};
if(adj.x == N-1 && adj.y == N-1) return adj.w; // 도착지를 만나면 도착지 까지의 거리 반환
if(bound(adj)&&d[ny][nx] > adj.w) {
d[ny][nx] = adj.w;
PQ.push(adj);
}
}
}
}
int main() {
int G[125][125], d[125][125];
int T = 0;
while(1) {
scanf("%d",&N);
if(N==0) break;
for(int i=0;i<N;++i) {
for(int j=0;j<N;++j) {
scanf("%d",&G[i][j]);
d[i][j] = INT32_MAX;
}
}
printf("Problem %d: %d\n",++T,bfs(G,d)+G[0][0]);
}
}
문제 분류는 다익스트라였기에 다익스트라로 시작했지만, 사실 우선순위 큐를 사용한 bfs로 문제를 해결했다.
문제에서 주어진 TC들을 수행한 후 d(거리)배열 출력 결과를 살펴보니 모든 정점에 대한 거리 업데이트가 이루어지지 않은 채 종료된 경우가 많았는데 priority queue의 이용과 (N-1,N-1)을 만나면 조기 종료하도록 작성했기 때문으로 보인다.
- N = 3
0 | 3 | 6 |
5 | 12 | 8 |
9 | INF | 15 |
- N = 4
0 | 2 | 3 | 12 | INF |
7 | 10 | 5 | 13 | INF |
8 | 6 | 6 | 15 | INF |
8 | 15 | 14 | INF | INF |
9 | 10 | 11 | 11 | 16 |
Comments