https://www.acmicpc.net/problem/4485
4485번: 녹색 옷 입은 애가 젤다지?
문제 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주인공, 링크는 지금 도둑루피만 가득한 N x N 크기의 동굴의 제일 왼쪽 위에 있다. [0][0]번 칸이기도 하다. 왜 이런 곳에 들어왔냐고 묻는다면 밖에서 사람들이 자꾸 "젤다의 전설에 나오는 녹색 애가 젤다지?"라고 물어봤기 때문이다. 링크가 녹색 옷을 입
www.acmicpc.net
다익스트라 알고리즘 문제라고 한다. PrioPriorityQueue를 이용해서 각 좌표의 최단 거리를 탐색한다.
+) 다익스트라 문제는 Dynamic 프로그래밍 처럼 작은것이 모여서 큰것이 될 수 도 있고, 정렬을 사용하게 되면 Greedy 처럼 해결할 수 도 있다.
PriorityQueue에 조건만 잘 주면 된다!
ps. 다음부터 큐에 좌표값 넣을 때 클래스 만들자 .. 코드가 더러운거같다.ㅠㅠ;
+ 쿠팡 온라인 테스트에 비슷한 문제가 제출되어서 풀어봤다 ...;;
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
import java.io.*;
import java.util.*;
public class Main_젤다 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int[] di = { 0, 1, 0, -1 }, dj = { 1, 0, -1, 0 };
int tc = 0;// 테스트케이스
while (true) {
tc++;
int n = Integer.parseInt(br.readLine());
if (n == 0)
break;
int[][] map = new int[n][n]; // 입력 맵
int[][] tmap = new int[n][n]; // 최소값 넣는 맵
int INF = Integer.MAX_VALUE;
boolean[][] visit = new boolean[n][n];
PriorityQueue<int[]> q = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return Integer.compare(o1[2], o2[2]);
}
});
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
tmap[i][j] = INF;
}
}
tmap[0][0] = map[0][0]; // 스타트 지점은 항상 최소값이다
q.add(new int[] { 0, 0, map[0][0] });
while (!q.isEmpty()) {
int[] arr = q.poll();
int x = arr[0];
int y = arr[1];
int w = arr[2];
if (x == n - 1 && y == n - 1) {
System.out.println("Problem " + tc + ":" + " " + w);
break;
}
for (int i = 0; i < 4; i++) {
int nx = x + di[i];
int ny = y + dj[i];
if (nx >= 0 && ny >= 0 && nx < n && ny < n &&!visit[nx][ny] &&
tmap[nx][ny] > tmap[x][y] + map[nx][ny]) {
tmap[nx][ny] = tmap[x][y] + map[nx][ny];
q.add(new int[] { nx, ny, tmap[nx][ny] });
}
}
visit[x][y] = true;
}
}
}
}
|
cs |
+ 코드설명
line 28 ~ 33 : cost 값을 셋팅해 줘야 합니다. 최솟값으로 최댓값으로, 최댓값이라면 최솟값으로 =
line 35 : 시작 하는 지점을 map[0][0] 으로 지정해야 합니다.
line 51 : 이전에 가봤거나 혹은 최댓값인 경우(초기 셋팅된 값으로) 와 현재 cost 비용 그리고 다음 위치의 맵 값과 반드시 비교해줘야 합니다.
'알고리즘' 카테고리의 다른 글
BOJ :: 17822 원판돌리기 (0) | 2021.05.02 |
---|---|
SWEA ::[모의 SW 역량테스트] 보호 필름 (0) | 2021.05.02 |
SWEA ::[모의 SW 역량테스트] 디저트카페 (0) | 2021.05.02 |
SWEA ::[모의 SW 역량테스트] 탈주범 검거 (0) | 2021.05.02 |
SWEA :: [모의 SW 역량테스트] 등산로 조성 (0) | 2021.05.02 |