[Algorithm] ๐Ÿฅ“๋ฐฑ์ค€ 1389 ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ 6๋‹จ๊ณ„ ๋ฒ•์น™

HaJingJingยท2021๋…„ 6์›” 15์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
69/119

0. ๋ฌธ์ œ

์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ 6๋‹จ๊ณ„ ๋ฒ•์น™์— ์˜ํ•˜๋ฉด ์ง€๊ตฌ์— ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ์ตœ๋Œ€ 6๋‹จ๊ณ„ ์ด๋‚ด์—์„œ ์„œ๋กœ ์•„๋Š” ์‚ฌ๋žŒ์œผ๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค. ์ผ€๋นˆ ๋ฒ ์ด์ปจ ๊ฒŒ์ž„์€ ์ž„์˜์˜ ๋‘ ์‚ฌ๋žŒ์ด ์ตœ์†Œ ๋ช‡ ๋‹จ๊ณ„ ๋งŒ์— ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒŒ์ž„์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ „ํ˜€ ์ƒ๊ด€์—†์„ ๊ฒƒ ๊ฐ™์€ ์ธํ•˜๋Œ€ํ•™๊ต์˜ ์ด๊ฐ•ํ˜ธ์™€ ์„œ๊ฐ•๋Œ€ํ•™๊ต์˜ ๋ฏผ์„ธํฌ๋Š” ๋ช‡ ๋‹จ๊ณ„๋งŒ์— ์ด์–ด์งˆ ์ˆ˜ ์žˆ์„๊นŒ?

์ฒœ๋ฏผํ˜ธ๋Š” ์ด๊ฐ•ํ˜ธ์™€ ๊ฐ™์€ ํ•™๊ต์— ๋‹ค๋‹ˆ๋Š” ์‚ฌ์ด์ด๋‹ค. ์ฒœ๋ฏผํ˜ธ์™€ ์ตœ๋ฐฑ์ค€์€ Baekjoon Online Judge๋ฅผ ํ†ตํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ตœ๋ฐฑ์ค€๊ณผ ๊น€์„ ์˜์€ ๊ฐ™์ด Startlink๋ฅผ ์ฐฝ์—…ํ–ˆ๋‹ค. ๊น€์„ ์˜๊ณผ ๊น€๋„ํ˜„์€ ๊ฐ™์€ ํ•™๊ต ๋™์•„๋ฆฌ ์†Œ์†์ด๋‹ค. ๊น€๋„ํ˜„๊ณผ ๋ฏผ์„ธํฌ๋Š” ๊ฐ™์€ ํ•™๊ต์— ๋‹ค๋‹ˆ๋Š” ์‚ฌ์ด๋กœ ์„œ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค. ์ฆ‰, ์ด๊ฐ•ํ˜ธ-์ฒœ๋ฏผํ˜ธ-์ตœ๋ฐฑ์ค€-๊น€์„ ์˜-๊น€๋„ํ˜„-๋ฏผ์„ธํฌ ์™€ ๊ฐ™์ด 5๋‹จ๊ณ„๋งŒ ๊ฑฐ์น˜๋ฉด ๋œ๋‹ค.

์ผ€๋นˆ ๋ฒ ์ด์ปจ์€ ๋ฏธ๊ตญ ํ—๋ฆฌ์šฐ๋“œ ์˜ํ™”๋ฐฐ์šฐ๋“ค ๋ผ๋ฆฌ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ๊ฒŒ์ž„์„ ํ–ˆ์„๋•Œ ๋‚˜์˜ค๋Š” ๋‹จ๊ณ„์˜ ์ด ํ•ฉ์ด ๊ฐ€์žฅ ์ ์€ ์‚ฌ๋žŒ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์˜ค๋Š˜์€ Baekjoon Online Judge์˜ ์œ ์ € ์ค‘์—์„œ ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ์„ ์ฐพ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์ผ€๋นˆ ๋ฒ ์ด์ปจ ์ˆ˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๊ณผ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ๊ฒŒ์ž„์„ ํ–ˆ์„ ๋•Œ, ๋‚˜์˜ค๋Š” ๋‹จ๊ณ„์˜ ํ•ฉ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, BOJ์˜ ์œ ์ €๊ฐ€ 5๋ช…์ด๊ณ , 1๊ณผ 3, 1๊ณผ 4, 2์™€ 3, 3๊ณผ 4, 4์™€ 5๊ฐ€ ์นœ๊ตฌ์ธ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

1์€ 2๊นŒ์ง€ 3์„ ํ†ตํ•ด 2๋‹จ๊ณ„ ๋งŒ์—, 3๊นŒ์ง€ 1๋‹จ๊ณ„, 4๊นŒ์ง€ 1๋‹จ๊ณ„, 5๊นŒ์ง€ 4๋ฅผ ํ†ตํ•ด์„œ 2๋‹จ๊ณ„ ๋งŒ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๋Š” 2+1+1+2 = 6์ด๋‹ค.

2๋Š” 1๊นŒ์ง€ 3์„ ํ†ตํ•ด์„œ 2๋‹จ๊ณ„ ๋งŒ์—, 3๊นŒ์ง€ 1๋‹จ๊ณ„ ๋งŒ์—, 4๊นŒ์ง€ 3์„ ํ†ตํ•ด์„œ 2๋‹จ๊ณ„ ๋งŒ์—, 5๊นŒ์ง€ 3๊ณผ 4๋ฅผ ํ†ตํ•ด์„œ 3๋‹จ๊ณ„ ๋งŒ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๋Š” 2+1+2+3 = 8์ด๋‹ค.

3์€ 1๊นŒ์ง€ 1๋‹จ๊ณ„, 2๊นŒ์ง€ 1๋‹จ๊ณ„, 4๊นŒ์ง€ 1๋‹จ๊ณ„, 5๊นŒ์ง€ 4๋ฅผ ํ†ตํ•ด 2๋‹จ๊ณ„ ๋งŒ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๋Š” 1+1+1+2 = 5์ด๋‹ค.

4๋Š” 1๊นŒ์ง€ 1๋‹จ๊ณ„, 2๊นŒ์ง€ 3์„ ํ†ตํ•ด 2๋‹จ๊ณ„, 3๊นŒ์ง€ 1๋‹จ๊ณ„, 5๊นŒ์ง€ 1๋‹จ๊ณ„ ๋งŒ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค. 4์˜ ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๋Š” 1+2+1+1 = 5๊ฐ€ ๋œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ 5๋Š” 1๊นŒ์ง€ 4๋ฅผ ํ†ตํ•ด 2๋‹จ๊ณ„, 2๊นŒ์ง€ 4์™€ 3์„ ํ†ตํ•ด 3๋‹จ๊ณ„, 3๊นŒ์ง€ 4๋ฅผ ํ†ตํ•ด 2๋‹จ๊ณ„, 4๊นŒ์ง€ 1๋‹จ๊ณ„ ๋งŒ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค. 5์˜ ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๋Š” 2+3+2+1 = 8์ด๋‹ค.

5๋ช…์˜ ์œ ์ € ์ค‘์—์„œ ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ์€ 3๊ณผ 4์ด๋‹ค.

BOJ ์œ ์ €์˜ ์ˆ˜์™€ ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— ์œ ์ €์˜ ์ˆ˜ N (2 โ‰ค N โ‰ค 100)๊ณผ ์นœ๊ตฌ ๊ด€๊ณ„์˜ ์ˆ˜ M (1 โ‰ค M โ‰ค 5,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์—๋Š” ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์นœ๊ตฌ ๊ด€๊ณ„๋Š” A์™€ B๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, A์™€ B๊ฐ€ ์นœ๊ตฌ๋ผ๋Š” ๋œป์ด๋‹ค. A์™€ B๊ฐ€ ์นœ๊ตฌ์ด๋ฉด, B์™€ A๋„ ์นœ๊ตฌ์ด๋ฉฐ, A์™€ B๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค. ์นœ๊ตฌ ๊ด€๊ณ„๋Š” ์ค‘๋ณต๋˜์–ด ๋“ค์–ด์˜ฌ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์นœ๊ตฌ๊ฐ€ ํ•œ ๋ช…๋„ ์—†๋Š” ์‚ฌ๋žŒ์€ ์—†๋‹ค. ๋˜, ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์นœ๊ตฌ ๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด์ ธ ์žˆ๋‹ค. ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์ด๋ฉฐ, ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— BOJ์˜ ์œ ์ € ์ค‘์—์„œ ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋Ÿฐ ์‚ฌ๋žŒ์ด ์—ฌ๋Ÿฌ ๋ช…์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ์‚ฌ๋žŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก ์นœ๊ตฌ๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์คŒ
๐Ÿ’ก cnt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ๊ณ„๋ฅผ ์•Œ์•„๋‚ด๊ณ  visited๋ฅผ ํ†ตํ•ด ๋ฐฉ๋ฌธ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•จ
๐Ÿ’ก ์‹œ์ž‘ ์‚ฌ๋žŒ์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ queue์— ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ ๋‹จ๊ณ„๋ฅผ +1ํ•ด์คŒ
๐Ÿ’ก ๊ฐ ์‚ฌ๋žŒ์˜ ๋ช…์ˆ˜๋งŒํผ ๊ธฐ์ค€ ์‚ฌ๋žŒ์„ ๋‹ฌ๋ฆฌํ•˜๋ฉฐ bfs๋ฅผ ํ•ด์ฃผ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ์ถœ๋ ฅํ•จ

2. ํ•ต์‹ฌ ํ’€์ด

  1. ์นœ๊ตฌ๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์คŒ
for(int i=0; i<m; i++) {
	s = br.readLine().split(" ");
	int v = Integer.parseInt(s[0]);
	int w = Integer.parseInt(s[1]);
	relation[v].add(w);
	relation[w].add(v);
}
  1. ์‹œ์ž‘ ์‚ฌ๋žŒ์„ ๊ธฐ์ค€์œผ๋กœ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ queue์— ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฐ ๋‹จ๊ณ„๋ฅผ +1ํ•ด์คŒ
while(!q.isEmpty()) {
	Person now = q.poll();
			
	for(int connect : relation[now.vertex]) {
		if(!visited[connect]) {
			sum+=(now.cnt+1);
			q.add(new Person(connect,now.cnt+1));
			visited[connect] = true;
		}
	}
			
}
  1. ๊ฐ ์‚ฌ๋žŒ์˜ ๋ช…์ˆ˜๋งŒํผ ๊ธฐ์ค€ ์‚ฌ๋žŒ์„ ๋‹ฌ๋ฆฌํ•˜๋ฉฐ bfs๋ฅผ ํ•ด์ฃผ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์˜ ์ธ๋ฑ์Šค๋ฅผ ์ถœ๋ ฅํ•จ
int min = Integer.MAX_VALUE;
int flag = -1;
for(int i=1; i<n+1; i++) {
	int ret = bfs(i);
	if(min > ret) {
		min = ret;
		flag = i;
	}
	Arrays.fill(visited, false);
}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Queue;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.Arrays;

public class Bruteforce_6 {
	static ArrayList<Integer>[] relation;
	static boolean[] visited;
	static int n;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] s = br.readLine().split(" ");
		
		n = Integer.parseInt(s[0]);
		int m = Integer.parseInt(s[1]);
		visited = new boolean[n+1];
		relation = new ArrayList[n+1];
		
		for(int i=1; i<n+1; i++)
			relation[i] = new ArrayList<>();
		
		for(int i=0; i<m; i++) {
			s = br.readLine().split(" ");
			int v = Integer.parseInt(s[0]);
			int w = Integer.parseInt(s[1]);
			relation[v].add(w);
			relation[w].add(v);
		}
		
		int min = Integer.MAX_VALUE;
		int flag = -1;
		for(int i=1; i<n+1; i++) {
			int ret = bfs(i);
			if(min > ret) {
				min = ret;
				flag = i;
			}
			Arrays.fill(visited, false);
		}
		
		System.out.println(flag);
	}
	
	static int bfs(int start) {
		Queue<Person> q = new LinkedList<>();
		q.add(new Person(start,0));
		visited[start] = true;
		int sum = 0;
		
		while(!q.isEmpty()) {
			Person now = q.poll();
			
			for(int connect : relation[now.vertex]) {
				if(!visited[connect]) {
					sum+=(now.cnt+1);
					q.add(new Person(connect,now.cnt+1));
					visited[connect] = true;
				}
			}
			
		}
		
		return sum;
	}
	
	static class Person{
		int vertex;
		int cnt;
		Person(int vertex, int cnt){
			this.vertex = vertex;
			this.cnt = cnt;
		}
	}
}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ
list์— ๊ฐ๊ฐ ๋„ฃ์–ด์ฃผ๋Š” ๊ฑฐ๋ฅผ ๊นœ๋นกํ–ˆ๋‹ค๐Ÿ˜ฅ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€