코딩테스트/DFS, BFS
[실버1] 백준 1398 케빈 베이컨의 6단계 법칙 Java 풀이 (bfs, 플로이드-워셜)
정재익
2025. 7. 24. 23:58
플로이드-워셜 방식 풀이
package org.practice.플로이드워셜;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 실버 1 케빈 베이컨의 6단계 법칙 플로이드 워셜 풀이
public class b1389FW {
static final int INF = 1000000;
static int[][] dist;
static int userCount;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
userCount = Integer.parseInt(st.nextToken());
int lineCount = Integer.parseInt(st.nextToken());
dist = new int[userCount][userCount];
// 거리 배열 초기화
for (int i = 0; i < userCount; i++) {
for (int j = 0; j < userCount; j++) {
if (i == j) dist[i][j] = 0;
else dist[i][j] = INF;
}
}
// 간선 입력
for (int i = 0; i < lineCount; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken()) - 1;
int v = Integer.parseInt(st.nextToken()) - 1;
dist[u][v] = 1;
dist[v][u] = 1;
}
// Floyd-Warshall
for (int k = 0; k < userCount; k++) {
for (int i = 0; i < userCount; i++) {
for (int j = 0; j < userCount; j++) {
if (dist[i][j] > dist[i][k] + dist[k][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
// 각 사용자별 케빈 베이컨 수 계산
int minSum = Integer.MAX_VALUE;
int answer = 0;
for (int i = 0; i < userCount; i++) {
int sum = 0;
for (int j = 0; j < userCount; j++) {
sum += dist[i][j];
}
if (sum < minSum) {
minSum = sum;
answer = i;
}
}
System.out.println(answer + 1); // 출력은 1번부터
}
}
BFS 방식 풀이
package org.practice.bd우선탐색;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
// 실버 1 케빈 베이컨의 6단계 법칙
// bfs로 풀었지만 플로이드-워셜도 가능하다
public class b1389 {
static int[][] arr;
static boolean[] visited;
static int userCount;
static int[] result;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
userCount = Integer.parseInt(st.nextToken());
int lineCount = Integer.parseInt(st.nextToken());
arr = new int[userCount][userCount];
result = new int[userCount];
for (int i = 0; i < lineCount; i++) {
st = new StringTokenizer(br.readLine());
int user = Integer.parseInt(st.nextToken()) - 1;
int friend = Integer.parseInt(st.nextToken()) - 1;
arr[user][friend] = 1;
arr[friend][user] = 1;
}
for (int i = 0; i < userCount; i++) {
visited = new boolean[userCount];
bfs(i);
}
int min = Integer.MAX_VALUE;
int answer = 0;
for (int i = 0; i < userCount; i++) {
if (result[i] < min) {
min = result[i];
answer = i;
}
}
System.out.println(answer + 1);
}
static void bfs(int startUser) {
Queue<int[]> queue = new LinkedList<>();
queue.offer(new int[]{startUser, 0});
visited[startUser] = true;
while (!queue.isEmpty()) {
int[] curr = queue.poll();
int currentUser = curr[0];
int depth = curr[1];
for (int i = 0; i < userCount; i++) {
if(arr[currentUser][i] == 1 && !visited[i]) {
visited[i] = true;
result[startUser] += depth + 1;
queue.offer(new int[]{i, depth + 1});
}
}
}
}
}