๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜

[Java] BOJ 1389 ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ 6๋‹จ๊ณ„ ๋ฒ•์น™

by ๐ŸŠ๊ทค๐ŸŠ 2024. 8. 19.

๋ฌธ์ œ 

๋ฌธ์ œ ๋งํฌ https://www.acmicpc.net/problem/1389

  • ์ผ€๋นˆ ๋ฒ ์ด์ปจ์˜ 6๋‹จ๊ณ„ ๋ฒ•์น™์— ์˜ํ•˜๋ฉด ์ง€๊ตฌ์— ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ์ตœ๋Œ€ 6๋‹จ๊ณ„ ์ด๋‚ด์—์„œ ์„œ๋กœ ์•„๋Š” ์‚ฌ๋žŒ์œผ๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋‹ค. ์ผ€๋นˆ ๋ฒ ์ด์ปจ ๊ฒŒ์ž„์€ ์ž„์˜์˜ ๋‘ ์‚ฌ๋žŒ์ด ์ตœ์†Œ ๋ช‡ ๋‹จ๊ณ„ ๋งŒ์— ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒŒ์ž„์ด๋‹ค.
  • ์ผ€๋นˆ ๋ฒ ์ด์ปจ์€ ๋ฏธ๊ตญ ํ—๋ฆฌ์šฐ๋“œ ์˜ํ™”๋ฐฐ์šฐ๋“ค ๋ผ๋ฆฌ ์ผ€๋นˆ ๋ฒ ์ด์ปจ ๊ฒŒ์ž„์„ ํ–ˆ์„๋•Œ ๋‚˜์˜ค๋Š” ๋‹จ๊ณ„์˜ ์ด ํ•ฉ์ด ๊ฐ€์žฅ ์ ์€ ์‚ฌ๋žŒ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • ์˜ค๋Š˜์€ 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๊นŒ์ง€์ด๋ฉฐ, ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ™์€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

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

  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— BFS๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
  • ์šฐ์„  ์ž…๋ ฅ์„ ๋ฐ›์œผ๋ฉด์„œ ๊ฐ ๋…ธ๋“œ๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๊ณ  for๋ฌธ์„ ํ†ตํ•ด ๊ฐ ๋…ธ๋“œ๋ฅผ ๋Œ๋ฉด์„œ BFS๋ฅผ ๋Œ๋ ค์ค€๋‹ค.
  • BFS๋ฅผ ๋Œ๋ฆด๋•Œ, ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ๊ฑฐ๋ฆฌ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๊ณ  ์ดˆ๊ธฐ ๋…ธ๋“œ๋ฅผ Queue์— ๋„ฃ์–ด์ค€๋’ค, ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ  while๋ฌธ์„ ๋Œ๋ฆฐ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  Queue์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋นผ๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ ์ค‘์— ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์˜ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด ๊ฐ’์„ ๊ธฐ์ค€ ๋…ธ๋“œ ๊ฑฐ๋ฆฌ + 1๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•˜๋Š” ๋ณ€์ˆ˜์— ๋”ํ•ด์ฃผ๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ Queue์— ๋„ฃ์–ด์ค€๋‹ค. 
  • ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋…ธ๋“œ๋ฅผ ๋‹ค ๋Œ๋•Œ๋งˆ๋‹ค min๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ min๊ฐ’์„ ๊ฐฑ์‹ ์‹œํ‚จ๋‹ค. 

๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

  • ์ฒ˜์Œ์— ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์ด๊ธธ๋ž˜ BFS๋กœ ํ’€๋‹ค๊ฐ€ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ํ’€์–ด์•ผ๋˜๋‚˜ ์‹ถ์–ด์„œ DFS๋กœ ํ’€์—ˆ๋‹ค๊ฐ€ 50%์—์„œ ํ‹€๋ ธ๋‹ค..
  • ๊ฒฐ๊ตญ ๋‹ค์‹œ BFS๋กœ ํ’€์–ด์„œ ๋งž์ท„๋‹ค...ใ…œใ…œ (์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” BFS..! ๋ช…์‹ฌํ•˜์ž...!)

์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ๋Š” BFS๋กœ...!!

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class BOJ1389 {

    static int N;
    static int M;
    static ArrayList<Integer> friends[];
    static boolean visited[];

    static int result;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());

        // ์œ ์ €์˜ ์ˆ˜
        N = Integer.parseInt(st.nextToken());
        // ์นœ๊ตฌ ๊ด€๊ณ„์˜ ์ˆ˜
        M = Integer.parseInt(st.nextToken());

        // ์นœ๊ตฌ ๊ด€๊ณ„ ์—ฐ๊ฒฐ
        friends = new ArrayList[N + 1];
        // ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
        visited = new boolean[N + 1];
        // ๊ฐ ๋…ธ๋“œ ์—ฐ๊ฒฐ ํšŸ์ˆ˜ ์ด ๋”ํ•  ๋ณ€์ˆ˜
        result = 0;

        // ํ•ด๋‹น ๋ฐฐ์—ด์„ ArrayList๋กœ ์ดˆ๊ธฐํ™”
        for(int i = 0; i <= N; i++){
            friends[i] = new ArrayList<>();
        }

        for(int i = 0; i < M; i++){
            StringTokenizer st2 = new StringTokenizer(br.readLine());

            // ๋…ธ๋“œ
            int a = Integer.parseInt(st2.nextToken());
            int b = Integer.parseInt(st2.nextToken());

            // ์„œ๋กœ์˜ ๋…ธ๋“œ์— ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ
            friends[a].add(b);
            friends[b].add(a);
        }

        // ์ตœ์†Ÿ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋ณ€์ˆ˜
        int min = Integer.MAX_VALUE;
        // ์ •๋‹ต ์œ ์ €
        int user = 0;

        // ๊ธฐ์ค€ ๋…ธ๋“œ๊ฐ€ ์ž๊ธฐ ๋…ธ๋“œ๋ง๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ• ๋•Œ๋งˆ๋‹ค
        // BFS๋ฅผ ๋Œ๋ ค์„œ ํšŸ์ˆ˜๋ฅผ ์นด์šดํŠธ
        for(int i = 1; i <= N; i++){
            // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ดˆ๊ธฐํ™”
            visited = new boolean[N + 1];
            // ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค BFS๋ฅผ ๋Œ๋ฆผ
            BFS(i);

            // min๋ณด๋‹ค ๊ฒฐ๊ณผ๊ฐ’์ด ๋” ์ž‘์œผ๋ฉด min ๊ฐฑ์‹ 
            if(min > result){
                min = result;

                user = i;
            }

            // BFS ๋Œ๋ฆฐ ๊ฒฐ๊ณผ๊ฐ’ ์ดˆ๊ธฐํ™”
            result = 0;
        }

        System.out.println(user);
    }

    public static void BFS(int x){
        Queue<Integer> q = new LinkedList<>();

        // ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด
        int distance[] = new int[N + 1];

        q.offer(x);

        // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        visited[x] = true;

        // Queue๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(!q.isEmpty()){
            int u = q.poll();

            // ๊ธฐ์ค€ ์œ ์ €์™€ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ์œ ์ €๋“ค์„ ๊ธฐ์ค€์œผ๋กœ
            for(int i : friends[u]){
                if(!visited[i]){
                    // ๋งŒ์•ฝ ํ•ด๋‹น ์œ ์ €๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
                    // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ ํ›„, ๊ธฐ์ค€ ์œ ์ €์˜ ๊ฑฐ๋ฆฌ + 1๋งŒํผ ๋ฐฐ์—ด์— ์ €์žฅ
                    visited[i] = true;
                    distance[i] = distance[u] + 1;

                    // ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์œ ์ €์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์— ํ•ด๋‹น ์œ ์ € ๊ฑฐ๋ฆฌ๋ฅผ
                    // ์ €์žฅํ•˜๊ณ  Queue์— ๋„ฃ์Œ
                    result = result + distance[i];
                    q.offer(i);
                }
            }
        }
    }
}