Java
[4485,자바] 백준 - 녹색 옷 입은 애기 젤다지 ? ( 다익스트라 )
힛해
2023. 11. 3. 17:54
728x90
https://www.acmicpc.net/problem/4485
4485번: 녹색 옷 입은 애가 젤다지?
젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주
www.acmicpc.net
다익스트라를 이용한 풀이다.
준비물
1. ArrayList를 담을 2차원 배열 : 인접 리스트
2. 위치값과 가중치를 저장할 : Node 클래스
3. 거리들을 저장할 2차원 거리 배열 : distance[][]
다익스트라 알고리즘은 처음 시작한 점과 끝점이 정해져있을 때 사용하면 좋은 알고리즘이다.
함수도 시작지점과 종료지점을 안다는 가정하에 작성하였다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static class Node {
int x, y, w;
public Node(int x, int y, int w) {
this.x = x;
this.y = y;
this.w = w;
}
}
static int[][] map;
static ArrayList<Node>[][] nodes;
static int[] dx = { 1, -1, 0, 0 };
static int[] dy = { 0, 0, 1, -1 };
static int size;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = 1;
while (true) {
size = Integer.parseInt(br.readLine());
if (size <= 0) {
break;
}
map = new int[size][size];
nodes = new ArrayList[size][size];
for (int i = 0; i < size; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < size; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
nodes[i][j] = new ArrayList<>();
}
} // 입력 종료
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
for (int k = 0; k < 4; k++) {
int a = i + dx[k];
int b = j + dy[k];
if (a >= 0 && a < size && b >= 0 && b < size) {
nodes[i][j].add(new Node(a, b, map[a][b]));
}
}
}
} // nodes 인접리스트완성
//System.out.println(Arrays.deepToString(map));
System.out.println("Problem "+ tc++ +": "+dijkstra());
} // while문
}// main문
static int dijkstra() {
int[][] distance = new int[size][size];
boolean[][] flag = new boolean[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
distance[i][j] = Integer.MAX_VALUE;
}
} // 최대값으로 초기화를 해둠
distance[0][0] = map[0][0]; // 시작점은 0으로 초기화해줌
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
int min = Integer.MAX_VALUE;
int idxx = -1000;
int idxy = -1000;
for (int k = 0; k < size; k++) {
for (int l = 0; l < size; l++) {
if(!flag[k][l] && min > distance[k][l]) {
min = distance[k][l];
idxx = k;
idxy = l;
} // 그 다음으로 가장 작은 값을 찾는 과정.
}
}
flag[idxx][idxy] = true;
for(int k = 0; k< nodes[idxx][idxy].size(); k++) {
Node current = nodes[idxx][idxy].get(k);
if(!flag[current.x][current.y] && distance[current.x][current.y] > distance[idxx][idxy] + current.w) {
distance[current.x][current.y] = distance[idxx][idxy] + current.w;
}
}
} // 두번째 for
} // 첫 for
//System.out.println(Arrays.deepToString(distance));
return distance[size-1][size-1];
}
}