๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

[BOJ] 2644 ์ดŒ์ˆ˜๊ณ„์‚ฐ (Java)

category Algorithm/BOJ 2022. 9. 11. 20:04

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

 

2644๋ฒˆ: ์ดŒ์ˆ˜๊ณ„์‚ฐ

์‚ฌ๋žŒ๋“ค์€ 1, 2, 3, …, n (1 ≤ n ≤ 100)์˜ ์—ฐ์†๋œ ๋ฒˆํ˜ธ๋กœ ๊ฐ๊ฐ ํ‘œ์‹œ๋œ๋‹ค. ์ž…๋ ฅ ํŒŒ์ผ์˜ ์ฒซ์งธ ์ค„์—๋Š” ์ „์ฒด ์‚ฌ๋žŒ์˜ ์ˆ˜ n์ด ์ฃผ์–ด์ง€๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ์ดŒ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

์ฐจ๋ก€๋Œ€๋กœ ์ด ๋…ธ๋“œ ๊ฐœ์ˆ˜ n๊ณผ a, b๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ฐ„์„ ๊ฐœ์ˆ˜ m, ๊ฐ๊ฐ์˜ ๊ด€๊ณ„๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.

a์—์„œ b๋กœ ๊ฐ€๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. 

2. ํ’€์ด

์–‘๋ฐฉํ–ฅ bfs, dfs๋กœ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๋ถ€๋ชจ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋ถ€๋ชจ๋ฅผ ํƒ€๊ณ  ๊ฐ€๋‹ค๋ณด๋ฉด ๋ฃจํŠธ๊ฐ€ ์กด์žฌํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋‹จ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค. ๋˜ํ•œ ๋ถ€๋ชจ๋ฅผ ํƒ€๊ณ  ๊ฐ€์•ผํ•˜๋ฏ€๋กœ dfs๊ฐ€ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐฉํ–ฅ์„ ์‹ ๊ฒฝ์“ธ ํ•„์š”๊ฐ€ ์—†์—ˆ๋˜๊ฒŒ, ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ๋ถ€ํ„ฐ ์ด๋ฏธ ๋ถ€๋ชจ์™€ ์ž์‹๊ฐ„์˜ ๊ด€๊ณ„๋Š” ํ™•์‹คํ•˜๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผํ•  ์ผ์€ a์—์„œ b๊นŒ์ง€ ๊ฐ€๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜์ด๋ฏ€๋กœ, a์—์„œ b๋ฅผ ์ฐพ์œผ๋Ÿฌ ๊ฐˆ ๋•Œ๋„ ๊ตณ์ด ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ฐพ์œผ๋Ÿฌ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ฆ‰, a๊ฐ€ ๋ถ€๋ชจ๋“  b๊ฐ€ ๋ถ€๋ชจ๋“  a์—์„œ b๊นŒ์ง€ ๊ฐ€๊ธฐ๋งŒํ•˜๋ฉด ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋”๊ตฐ๋‹ค๋‚˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋”๋”์šฑ ๋ฐฉํ–ฅ์„ ์‹ ๊ฒฝ์จ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

dfs, bfs ๋‘ ๊ฐ€์ง€๋กœ ํ’€์—ˆ๋‹ค.

dfs๋Š” ๊ธฐ์ €์กฐ๊ฑด์œผ๋กœ b์— ๋„์ฐฉํ•˜๋ฉด min์„ ๊ฐฑ์‹ ํ•˜๊ณ  return ํ•ด์ฃผ์—ˆ๋‹ค.

bfs๋Š” ํ์— ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ๋„ฃ์–ด์ค„ ๋•Œ ๊นŠ์ด๊นŒ์ง€ ๊ฐ™์ด ๋„ฃ์–ด์คฌ๋‹ค. ์—ฌ๊ธฐ์„œ ๊นŠ์ด๋Š” ์ด์ „ ๋…ธ๋“œ ๊นŠ์ด+1์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

[์‹คํ–‰๊ฒฐ๊ณผ]

dfs

bfs

ํ™•์‹คํžˆ dfs๋ณด๋‹ค bfs๊ฐ€ ๋น ๋ฅด๋‹ค.

3. ์ฝ”๋“œ

1) dfs

๋”๋ณด๊ธฐ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

	static List<List<Integer>> parent = new ArrayList<> ();
	static int V, E, ans, r1, r2;
	static int p1, p2, min;
	static boolean[] visited;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		V = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		p1 = Integer.parseInt(st.nextToken());
		p2 = Integer.parseInt(st.nextToken());
		E = Integer.parseInt(br.readLine());
		visited = new boolean[V+1];

		for (int i = 0; i <= V; i++) {
			parent.add(new ArrayList<> ());
		}
		
		for (int i = 0; i < E; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());
			parent.get(a).add(b);
			parent.get(b).add(a);
		} //์ž…๋ ฅ ๋
		
		min = Integer.MAX_VALUE;
		dfs(p1, 0);
		if (min == Integer.MAX_VALUE) System.out.println(-1);
		else System.out.println(min);
	}
	
	static void dfs(int node, int cnt) {
		if (node == p2) { //๋„์ฐฉ
			min = Math.min(min, cnt);
			//System.out.println(min);
			return;
		}
		
		visited[node] = true;
		int len = parent.get(node).size();
		for (int i = 0; i < len; i++) {
			int n = parent.get(node).get(i);
			if(visited[n]) continue;
			//System.out.println(n+" cnt: "+(cnt+1));
			dfs(n, cnt+1);
			visited[node] = false;
		}
		
		
	}
}

2) bfs

๋”๋ณด๊ธฐ
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	
	static int n, m, from, to, cnt;
	static boolean[] visited;
	static List<List<Integer>> family = new ArrayList<>();
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		StringTokenizer st = new StringTokenizer(br.readLine());
		from = Integer.parseInt(st.nextToken());
		to = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(br.readLine());
		
		//์ดˆ๊ธฐํ™”
		visited = new boolean[n+1];
		for (int i = 0; i <= n; i++) {
			family.add(new ArrayList<> ());
		}
		
		for (int i = 0; i < m; i++) {
			st = new StringTokenizer(br.readLine());
			int mem1 = Integer.parseInt(st.nextToken());
			int mem2 = Integer.parseInt(st.nextToken());
			family.get(mem1).add(mem2);
			family.get(mem2).add(mem1); //์–‘๋ฐฉํ–ฅ
		}
		
		bfs();
	}
	
	static void bfs() {
		Queue<Node> queue = new ArrayDeque<> ();
		visited[from] = true;
		queue.offer(new Node(from, 0));
		
		while (!queue.isEmpty()) {
			Node front = queue.poll();
			int len = family.get(front.pos).size();
			for (int i = 0; i < len; i++) {
				int idx = family.get(front.pos).get(i);
				if (visited[idx]) continue;
				
				if (idx == to) {
					System.out.println(front.d+1);
					return;
				}
				
				visited[idx] = true;
				queue.offer(new Node(idx, front.d+1)); //ํ์— ๋„ฃ์–ด์ค„ ๋•Œ ๊นŠ์ด๋ฅผ ๊ฐ™์ด ๋„ฃ์–ด์คŒ
			}
		}
		System.out.println(-1);
	}
	static class Node {
		int pos, d;
		public Node(int pos, int d) {
			this.pos = pos;
			this.d = d;
		}
	}
}

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] 15683 ๊ฐ์‹œ (Java)  (0) 2022.09.15
[BOJ] 2638 ์น˜์ฆˆ (Java)  (0) 2022.09.11
[BOJ] 2193 ์ด์นœ์ˆ˜ (Java)  (0) 2022.09.06
[BOJ] 15686 ์น˜ํ‚จ๋ฐฐ๋‹ฌ [Java]  (0) 2022.08.29
[BOJ] 16637 ๊ด„ํ˜ธ์ถ”๊ฐ€ํ•˜๊ธฐ [Java]  (0) 2022.08.28