[백준/JAVA] 18243번: Small World Network
📖 문제
18243번: Small World Network
첫 번째 줄에 지구에 있는 사람의 수 N과 친구 관계의 개수 K가 주어진다. 모든 사람은 1부터 N까지 번호가 매겨져 있다. (1 ≤ N ≤ 100, 0 ≤ K ≤ N×(N-1)/2) 두 번째 줄부터 K+1번째 줄까지 친구
www.acmicpc.net
💡 풀이 방식
• 플로이드-워셜
- 최단 경로 배열을 모두 큰 값으로 초기화한다. (단, 행과 열이 같은 경우는 0으로 설정)
- 입력받은 두 점 간 거리를 1로 설정한다.
- 플로이드-워셜을 통해 모든 정점 간의 최소 거리를 구한다.
- 7단계 이상인 단계가 존재하는 경우, Big World를 출력한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
import java.util.*;
import java.io.*;
public class Main {
static final int INF = Integer.MAX_VALUE;
static int N, K;
static int[][] dist; // 최단 거리 배열
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
// 최단 거리 배열 초기화
dist = new int[N + 1][N + 1];
for(int i = 1 ; i <= N ; i++) {
for(int j = 1 ; j <= N ; j++) {
if(i == j) continue;
dist[i][j] = INF;
}
}
while(K --> 0) {
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
dist[a][b] = 1;
dist[b][a] = 1;
}
for(int k = 1 ; k <= N ; k++) {
for(int i = 1 ; i <= N ; i++) {
for(int j = 1 ; j <= N ; j++) {
if(i == j || j == k || i == k) continue; // 출발지=경유지 or 경유지=도착지 or 도착지=출발지면 pass
if(dist[i][k] != INF && dist[k][j] != INF) { // 출발지-경유지 길이 있고, 경유지-도착지 길이 있는 경우
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
for(int i = 1 ; i <= N ; i++) {
for(int j = 1 ; j < i ; j++) {
if(i == j) continue;
if(dist[i][j] == INF || dist[i][j] > 6) {
System.out.println("Big World!");
return;
}
}
}
System.out.println("Small World!");
}
}
|
cs |
➕ 다른 풀이 방식
플로이드-워셜 부분에서 위처럼 if문 작성할 필요가 없다.
dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);
💦 어려웠던 점
- 최단 거리 갱신할 때 식을 dist[k][j] + 1
로 했었는데 그게 아니고, dist[i][k] + dist[j][k]
로 하면 되는 것이었다~
- 플로이드-워셜 3중 for문에서 j 범위를 i까지 해서 73-76%에서 틀렸었다. 다시 N으로 범위 바꿔주니까 정상작동 되었음!
- 문제 보자마자 플로이드-워셜인 걸 떠올렸다. 잊고 있던 플로이드-워셜 복기 성공~~
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
백준 No.18243 Small World Network - JAVA
문제 작은 세상 네트워크(Small World Network)란 Milgram교수가 1967년에 처음으로 밝혀낸 이론이다. 간단히 설명하자면 전체 네트워크가 거대하더라도 전체가 서로 가깝게 연결될 수 있다는 이론이다.
jaewoo2233.tistory.com
[백준] S1 18243번 Small World Network (JAVA)
문제 출처 - Baekjoon Online Judge 문제는 여기 18243번: Small World Network 첫 번째 줄에 지구에 있는 사람의 수 N과 친구 관계의 개수 K가 주어진다. 모든 사람은 1부터 N까지 번호가 매겨져 있다. (1 ≤ N ≤
blackvill.tistory.com