반응형
백준 1389번 문제 - 케빈 베이컨의 6단계 법칙
1389번: 케빈 베이컨의 6단계 법칙
첫째 줄에 유저의 수 N (2 ≤ N ≤ 100)과 친구 관계의 수 M (1 ≤ M ≤ 5,000)이 주어진다. 둘째 줄부터 M개의 줄에는 친구 관계가 주어진다. 친구 관계는 A와 B로 이루어져 있으며, A와 B가 친구라는 뜻
www.acmicpc.net
문제 분석
- 사람 수가 정해지고 친구 사이 거리가 1인 조합이 주어진다.
- 이 때, 나를 제외한 나머지 사람들과의 친구 사이 거리의 합이 가장 적은 사람의 INDEX를 출력해라
- 그런 사람이 여러 명일 경우에는 번호가 가장 작은 사람을 출력해라
- 예를 들어, BOJ의 유저가 5명이고, 1과 3, 1과 4, 2와 3, 3과 4, 4와 5가 친구인 경우를 생각해보자.
1의 친구 사이 거리 합 : 2+1+1+2 = 6
2의 친구 사이 거리 합 : 2+1+2+3 = 8
3의 친구 사이 거리 합 : 1+2+1+2 = 5
4의 친구 사이 거리 합 : 1+2+1+2 = 5
5의 친구 사이 거리 합 : 2+3+2+1 = 8
여기서 답은 친구사이의 거리의 합이 5인 3, 4이다. 즉 답은 3이다.
해결 포인트
- BFS 사용
- BFS 사용해서 각 index에 친구 사이 합을 구한다.
- sum을 0으로 초기화, count는 1로 초기화
- 큐에 해당 index 추가, 방문 체크
- 현재 큐에 담아있는 을 다 빼서 해당 INDEX에 친구 관계 중 방문하지 않은 경우 큐에 추가
큐에 추가하면서 방문 체크 및 sum 값에 count 추가 - 다 확인 했으면 count 증가
- 큐가 빌 때까지 반복
Boolean과 boolean
처음에 visit 확인할 때 nullPointer Error 발생
- visit를 Boolean 배열로 구현하였는데 해당 문제 발생.
- visit를 boolean 배열로 변경하니 문제 해결.
왜일까?!
Boolean은 객체 자료형이고 초기화되지 않은 상태에서는 기본적으로 null을 가진다.
따라서 Boolean 배열로 선언한 경우, 배열의 각 요소는 초기화되지 않아 null 상태가 된다.
이로 인해 if (!visit[value])에서 null을 체크하면서 NullPointerException이 발생할 수 있다.
boolean은 기본 자료형으로서 자동으로 초기화된다.
초기화되지 않은 boolean 배열의 각 요소는 false로 초기화됩니다.
따라서 boolean 배열로 선언한 경우 초기화 문제가 발생하지 않습니다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static ArrayList<Integer>[] friends;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
friends = new ArrayList[N + 1];
for (int i = 1; i <= N; i++) {
friends[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
friends[a].add(b);
friends[b].add(a);
}
int min = 99999999;
int minIndex = 0;
for (int i = 1; i <= N; i++) {
int value = BFS(i, N);
if (value < min) {
min = value;
minIndex = i;
}
}
bw.write(minIndex + "\n");
bw.flush();
bw.close();
}
public static int BFS(int index, int N) {
boolean[] visit = new boolean[N + 1];
Queue<Integer> queue = new LinkedList<>();
int sum = 0;
visit[index] = true;
queue.add(index);
int count = 1;
while (!queue.isEmpty()) {
int queueSize = queue.size();
for (int q = 0; q < queueSize; q++) {
Integer newIndex = queue.poll();
for (int value : friends[newIndex]) {
if (!visit[value]) {
visit[value] = true;
queue.add(value);
sum += count;
}
}
}
count++;
}
return sum;
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 10026] 적록색약 (JAVA) (1) | 2024.01.02 |
---|---|
[백준 6064] 카잉 달력 (JAVA) (1) | 2023.12.28 |
[백준 20529] 가장 가까운 세 사람의 심리적 거리 (JAVA) (1) | 2023.12.26 |
[백준 11403] 경로 찾기 (JAVA) (1) | 2023.12.26 |
[백준 5525] IOIOI (JAVA) (1) | 2023.12.26 |