J

[JAVA] BOJ ๋ฐฑ์ค€ 9205 ๋งฅ์ฃผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ‡ BOJ

[JAVA] BOJ ๋ฐฑ์ค€ 9205 ๋งฅ์ฃผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ

snowball๐Ÿฐ 2023. 4. 4. 09:38

https://www.acmicpc.net/problem/9205

 

9205๋ฒˆ: ๋งฅ์ฃผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ

์†ก๋„์— ์‚ฌ๋Š” ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ๋“ค์€ ์†ก๋„์—์„œ ์—ด๋ฆฌ๋Š” ํŽœํƒ€ํฌํŠธ ๋ฝ ํŽ˜์Šคํ‹ฐ๋ฒŒ์— ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์˜ฌํ•ด๋Š” ๋งฅ์ฃผ๋ฅผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ถœ๋ฐœ์€ ์ƒ๊ทผ์ด๋„ค ์ง‘์—์„œ ํ•˜๊ณ , ๋งฅ์ฃผ ํ•œ ๋ฐ•์Šค๋ฅผ ๋“ค๊ณ  ์ถœ๋ฐœํ•œ๋‹ค.

www.acmicpc.net

๐Ÿ’ก DFS, BFS, ๋‹ค์ต์ŠคํŠธ๋ผ, ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ชจ๋‘๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋‚˜๋Š” BFS๋ฅผ ์ œ์™ธํ•œ ์„ธ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

๐Ÿ“Œ Floyd Warshall ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ

1. ์ด์ฐจ์› ๋ฐฐ์—ด places์— ์ง‘, ํŽธ์˜์ , ํŽ˜์Šคํ‹ฐ๋ฒŒ์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค.
2. ์ด์ฐจ์› ๋ฐฐ์—ด D์— ๊ฒฝ์œ ์ง€ ์—†์ด ๊ฑธ์–ด์•ผํ•˜๋Š” ์ตœ๋Œ€ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•œ๋‹ค. (๊ฒฝ์œ ์ง€ = ํŽธ์˜์ )
3. beer()์—์„œ Floyd ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ D์˜ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
4. ์ด๋•Œ ์ง‘๋ถ€ํ„ฐ ํŽ˜์Šคํ‹ฐ๋ฒŒ ์‚ฌ์ด์˜ D๊ฐ’์ด 1000์„ ๋„˜๋Š”๋‹ค๋ฉด ๋งฅ์ฃผ๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— false๋ฅผ ์•„๋‹ˆ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
import java.io.*;
import java.util.*;

public class BOJ_9205_floyd {
	static int[][] places, D;
	static int n;
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(bf.readLine());
		for(int t=1; t<=T; t++) {
			n = Integer.parseInt(bf.readLine());
			places = new int[n+2][2];
			D = new int[n+2][n+2]; // ๋งˆ์ง€๋ง‰์œผ๋กœ ๋งฅ์ฃผ๋ฅผ ๊ตฌ๋งคํ•œ ๊ณณ์œผ๋กœ๋ถ€ํ„ฐ ํŽ˜์Šคํ‹ฐ๋ฒŒ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
			for(int i=0; i<n+2; i++) {
				StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
				places[i][0] = Integer.parseInt(st.nextToken());
				places[i][1] = Integer.parseInt(st.nextToken());
			}
			for(int i=0; i<n+2; i++) {
				for(int j=i+1; j<n+2; j++) {
					D[i][j] = Math.abs(places[i][0]-places[j][0])+Math.abs(places[i][1]-places[j][1]);
					D[j][i] = D[i][j];
				}
			}
			System.out.println(beer() ? "happy" : "sad");
		}
	}
	static boolean beer() {
		for(int k=1; k<=n; k++) {
			for(int i=0; i<n+1; i++) {
				for(int j=1; j<n+2; j++) {
					if(k == i || k == j || i == j) continue;
					if(D[i][k] <= 1000 && D[k][j] < D[i][j])
						D[i][j] = D[k][j];
				}
			}
		}
		if(D[0][n+1] <= 1000) return true;
		return false;
	}
}

beer()์˜ 3์ค‘ for๋ฌธ์„ ๋ณด๋ฉด k, i, j์ค‘ ๊ฐ™์€ ๊ฐ’์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ D๋ฅผ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์•„๋„ ํ•ญ์ƒ ์ตœ์†Œ๊ฐ’์ธ 0์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๊ฒฝ์œ ์ง€๋ฅผ ์ค‘๊ฐ„์— ๋งŒ๋‚˜๊ฒŒ ๋˜๋ฉด 1. (์ถœ๋ฐœ์ง€์—์„œ ๊ฒฝ์œ ์ง€๊นŒ์ง€ ๊ฑฐ๋ฆฌ๊ฐ€ 1000์ดํ•˜)์ด๊ณ  2. (๊ฒฝ์œ ์ง€๋ถ€ํ„ฐ ๋„์ฐฉ์ง€๊นŒ์ง€ ๊ฑฐ๋ฆฌ)๊ฐ€ < (์ถœ๋ฐœ์ง€๋ถ€ํ„ฐ ๋„์ฐฉ์ง€๊นŒ์ง€ ๊ฑฐ๋ฆฌ)๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

๐Ÿ“Œ Dijkstra ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ

1. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ places๋ฐฐ์—ด์— ์œ„์น˜ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
2. ์ด๋ฒˆ์—” ์ผ์ฐจ์› ๋ฐฐ์—ด D์— ์ถœ๋ฐœ์ง€๋ถ€ํ„ฐ ๊ฐ ์œ„์น˜๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•œ๋‹ค. 
(์ด๋•Œ, ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ์šฐ ๊ฐ ๊ฑฐ๋ฆฌ๊ฐ€ 1000์ดํ•˜์ผ๋•Œ๋งŒ ๊ฐ’์„ ์ˆ˜์ •ํ•ด์ค€๋‹ค. ์•ˆ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)
3. D[ํŽ˜์Šคํ‹ฐ๋ฒŒ]์˜ ๊ฐ’์ด ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด 1000์ดํ•˜์˜ ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ "sad"๋ฐ˜ํ™˜
import java.io.*;
import java.util.*;

public class BOJ_9205_Dijkstra {
	static int[][] places;
	static int[] D;
	static int n;
	static class Node{
		int to;
		int weak;
		Node link;
		public Node(int to, int weak, Node link) {
			super();
			this.to = to;
			this.weak = weak;
			this.link = link;
		}
	}
	static Node[] nodes;
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(bf.readLine());
		for(int t=1; t<=T; t++) {
			n = Integer.parseInt(bf.readLine());
			places = new int[n+2][2];
			for(int i=0; i<n+2; i++) {
				StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
				places[i][0] = Integer.parseInt(st.nextToken());
				places[i][1] = Integer.parseInt(st.nextToken());
			}
			
			nodes = new Node[n+2];
			for(int i=0; i<n+2; i++) {
				for(int j=i+1; j<n+2; j++) {
					if(i == j) continue;
					int weak = Math.abs(places[i][0]-places[j][0])+Math.abs(places[i][1]-places[j][1]);
					if(weak <= 1000) {
						nodes[i] = new Node(j, weak, nodes[i]);
						nodes[j] = new Node(i, weak, nodes[j]);
					}
				}
			}
			
			D = new int[n+2];
			Arrays.fill(D, 987654321);
			PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> Integer.compare(o1[1], o2[1]));
			D[0] = 0;
			pq.offer(new int[] {0, 0});
			while(!pq.isEmpty()) {
				int[] now = pq.poll();
				if(now[1] > D[now[0]]) continue;
				for(Node n = nodes[now[0]]; n!= null; n = n.link)  {
					if(D[n.to] > now[1] + n.weak) {
						D[n.to] = now[1] + n.weak;
						pq.offer(new int[] {n.to, D[n.to]});
					}
				}
			}
			
			System.out.println(D[n+1] == 987654321 ? "sad" : "happy");
		}
	}
}

์ž์„ธํžˆ ๋ณด์ž

D = new int[n+2];
Arrays.fill(D, 987654321);
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> Integer.compare(o1[1], o2[1]));
D[0] = 0;
pq.offer(new int[] {0, 0});
while(!pq.isEmpty()) {
	int[] now = pq.poll();
	if(now[1] > D[now[0]]) continue;
	for(Node n = nodes[now[0]]; n!= null; n = n.link)  {
		if(D[n.to] > now[1] + n.weak) {
			D[n.to] = now[1] + n.weak;
			pq.offer(new int[] {n.to, D[n.to]});
		}
	}
}

System.out.println(D[n+1] == 987654321 ? "sad" : "happy");
  1. D ๋ฐฐ์—ด ์„ ์–ธ
  2. D์— ์ดˆ๊ธฐ๊ฐ’์„ ์ค€๋‹ค.
  3. ์šฐ์„ ์ˆœ์œ„ ํ์— ์ถœ๋ฐœ์ง€๋กœ๋ถ€ํ„ฐ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  4. ์ดˆ๊ธฐ๊ฐ’์€ ์ถœ๋ฐœ์ง€๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด๋•Œ ์ถœ๋ฐœ์ง€๋กœ๋ถ€ํ„ฐ ์ถœ๋ฐœ์ง€๊นŒ์ง€ ๊ฑฐ๋ฆฌ๋Š” 0์ด๋‹ค.
  5. now[1] = ์ถœ๋ฐœ์ง€๋ถ€ํ„ฐ now[0]๊นŒ์ง€ ๊ฑฐ๋ฆฌ
  6. D[ํ˜„์žฌ ์œ„์น˜] < now[1]์ธ ๊ฒฝ์šฐ now[0]์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๊ฐฑ์‹ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ’์œผ๋กœ ๋‹ค๋ฅธ ๊ฐ’๋“ค์„ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  7. ๊ทธ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ํ˜„์žฌ ์œ„์น˜๋กœ๋ถ€ํ„ฐ 1000์ดํ•˜๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’๋“ค์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

๐Ÿ“Œ DFS ์ด์šฉ

1. places์™€ D์˜ ์ดˆ๊ธฐ๊ฐ’์€ Floyd์™€ ๋™์ผํ•˜๋‹ค.
2. visited๋ฅผ ์ด์ฐจ์› ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜์—ฌ ์ถœ๋ฐœ์ง€๋กœ๋ถ€ํ„ฐ ๋„์ฐฉ์ง€(๊ฒฝ์œ ์ง€)๊นŒ์ง€์˜ ์กฐ์‚ฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒŒ ํ•œ๋‹ค.
3. dfs(x)๋Š” x๋ฅผ ์ถœ๋ฐœ์ง€๋กœ ํ•  ๋•Œ n+1(๋„์ฐฉ์ง€)๊นŒ์ง€ ๋งฅ์ฃผ๋ฅผ ๋งˆ์‹œ๋ฉฐ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
4. x๊ฐ€ n+1์— ๋„์ฐฉํ•œ๋‹ค๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ true๋ฅผ ๋ฐ˜ํ™˜
5. for๋ฌธ์„ ํ†ตํ•ด 1๋ถ€ํ„ฐ n+1๊นŒ์ง€ ์กฐ์‚ฌํ•˜๋ฉด์„œ ์กฐ์‚ฌํ•˜์ง€ ์•Š์€ ๊ธธ์ด๊ณ  ๊ฑฐ๋ฆฌ๊ฐ€ 1000์ดํ•˜์ด๋ฉด ๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— dfs๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœํ•œ๋‹ค.
import java.io.*;
import java.util.*;

public class BOJ_9205_dfs{
	static int[][] places, D;
	static int n;
	static boolean[][] v;
	static boolean flag;
	
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(bf.readLine());
		for(int t=1; t<=T; t++) {
			n = Integer.parseInt(bf.readLine());
			places = new int[n+2][2];
			D = new int[n+2][n+2];
			for(int i=0; i<n+2; i++) {
				StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
				places[i][0] = Integer.parseInt(st.nextToken());
				places[i][1] = Integer.parseInt(st.nextToken());
			}
			for(int i=0; i<n+2; i++) {
				for(int j=i+1; j<n+2; j++) {
					D[i][j] = Math.abs(places[i][0]-places[j][0])+Math.abs(places[i][1]-places[j][1]);
					D[j][i] = D[i][j];
				}
			}
			v = new boolean[n+2][n+2];
			flag = false;
			System.out.println(dfs(0) ? "happy" : "sad");
		}
	}
	static boolean dfs(int x) {
		if(flag) return true;
		if(x == n+1) {
			flag = true;
			return true;
		}
		boolean flag = false;
		for(int i=n+1; i>=1; i--) {
			if(i == x || v[x][i] || D[x][i] > 1000) continue;
			v[x][i] = true;
			flag |= dfs(i);
			
		}
		return flag;
	}
}
Comments