[BOJ] 1389 - 케빈 베이컨의 6단계 법칙 (S1)

34suuuuu·2022년 11월 25일
0

알고리즘

목록 보기
38/43

문제 링크

1389-케빈 베이컨의 6단계 법칙


입력

첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다.
둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻이다. A와 B가 친구이면, B와 A도 친구이며, A와 B가 같은 경우는 없다.
친구 관계는 중복되어 들어올 수도 있으며, 친구가 한 명도 없는 사람은 없다.
또, 모든 사람은 친구 관계로 연결되어져 있다. 사람의 번호는 1부터 N까지이며, 두 사람이 같은 번호를 갖는 경우는 없다.


출력

첫째 줄에 BOJ의 유저 중에서 케빈 베이컨의 수가 가장 작은 사람을 출력한다. 그런 사람이 여러 명일 경우에는 번호가 가장 작은 사람을 출력한다


문제 풀이

bfs 이용해서 풀 수 있지만
플로이드 와샬 알고리즘을 이용해 풀었다.

기본적으로 플로이드 와샬 알고리즘은 다이나믹 프로그래밍 기술에 의거해 '모든 정점'에서 '모든 정점'으로의 최단 경로를 구하고자 할 때 이용 ( 링크 참고)

최단 경로를 나타내기 위해 arr[i][j] > arr[i][k] + arr[k][j] 이런 조건문을 내걸고
모든 정점 사이의 최단 거리가 저장되어있는 arr을 이용해 최소 갯수에 해당하는 인덱스를 탐색한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int[][] arr = new int[n+1][n+1];

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                arr[i][j] = 987654321;
                if(i==j) arr[i][j] = 0;
            }
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());

            arr[from][to] = arr[to][from] = 1;
        }

        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    if (arr[i][j] > arr[i][k] + arr[k][j]) {
                        arr[i][j] = arr[i][k] + arr[k][j];
                    }
                }
            }
        }
        int result =987654321;
        int idx = -1;
        for (int i = 1; i <= n; i++) {
            int sum = 0;
            for (int j = 1; j <= n; j++) {
                sum += arr[i][j];
            }

            if (result > sum) {
                result = sum;
                idx = i;
            }
        }
        System.out.println(idx);
    }
}
profile
꾸준히 하려고 노력하는 편,,

0개의 댓글