Skip to content

Commit e567efd

Browse files
committed
[Gold V] Title: 귀찮은 해강이, Time: 384 ms, Memory: 51852 KB -BaekjoonHub
1 parent fb15954 commit e567efd

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# [Gold V] 귀찮은 해강이 - 24391
2+
3+
[문제 링크](https://www.acmicpc.net/problem/24391)
4+
5+
### 성능 요약
6+
7+
메모리: 51852 KB, 시간: 384 ms
8+
9+
### 분류
10+
11+
그래프 이론, 자료 구조, 그래프 탐색, 분리 집합
12+
13+
### 제출 일자
14+
15+
2025년 7월 7일 10:10:45
16+
17+
### 문제 설명
18+
19+
<p>해강이는 앙중대학교에 다닌다. 해강이는 이번 학기에 강의코드 1번부터 <em>N</em>번까지 <em>N</em>개의 강의를 듣고 있다.</p>
20+
21+
<p>모든 강의는 강의코드와 동일한 번호의 건물에서 진행된다. 예를 들어, 강의코드가 1인 강의는 1번 건물에서 진행되고, 강의코드가 <em>N</em>-1인 강의는 <em>N</em>-1번 건물에서 진행된다.</p>
22+
23+
<p>해강이는 밖에 나오는 것을 싫어해서, 강의 시간표 순서대로 모든 강의를 들으면서 한 건물에서 밖으로 나와서 다른 건물로 이동하는 횟수를 최소화하고 싶다. 앙중대학교에는 다행히도 서로 연결되어 있는 건물들이 있어, 이 건물끼리는 밖으로 나오지 않고 이동할 수 있다.</p>
24+
25+
<p>해강이의 강의 시간표가 주어질 때, 밖에 나오는 것을 싫어하는 해강이를 위해 최소 몇 번만 밖에 나오면 되는지 구해보자. 맨 처음 강의를 들으러 이동하는 횟수는 세지 않는다.</p>
26+
27+
### 입력
28+
29+
<p>첫째 줄에 강의의 개수 <em>N</em>(1 ≤ <em>N</em> ≤ 10<sup>5</sup>)과 연결되어 있는 건물의 쌍의 개수 <em>M</em>(0 ≤ <em>M</em> ≤ 10<sup>5</sup>)이 공백으로 구분되어 주어진다.</p>
30+
31+
<p>두 번째 줄부터는 <em>M</em>줄에 걸쳐 <em>i</em>와 <em>j</em>(1 ≤ <em>i</em>, <em>j</em> ≤ <em>N</em>)가 주어진다. 이는 <em>i</em>번 건물과 <em>j</em>번 건물이 연결되어 있다는 의미이다. 건물이 자기 자신과 연결되거나, 이미 연결된 건물의 쌍이 다시 주어지는 경우는 없다.</p>
32+
33+
<p>마지막 줄에는 <em>N</em>개의 강의코드 <em>A<sub>i</sub></em>(1 ≤ <em>A<sub>i</sub></em> ≤ <em>N</em>)로 이루어진 강의 시간표가 공백으로 구분되어 주어진다.</p>
34+
35+
### 출력
36+
37+
<p>해강이가 밖에 나와야 하는 최소 횟수를 출력한다.</p>
38+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.io.BufferedReader;
2+
import java.io.InputStreamReader;
3+
import java.math.BigInteger;
4+
import java.io.IOException;
5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
import java.util.HashSet;
8+
import java.util.Set;
9+
import java.util.StringTokenizer;
10+
11+
class Main {
12+
static int[] parent;
13+
public static void main(String[] args) throws IOException {
14+
15+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
16+
17+
StringTokenizer st = new StringTokenizer(br.readLine());
18+
int N = Integer.parseInt(st.nextToken());
19+
int M = Integer.parseInt(st.nextToken());
20+
21+
parent = new int[N+1];
22+
23+
for(int i = 1; i<=N; i++) {
24+
parent[i] = i;
25+
}
26+
for(int i =0; i<M; i++) {
27+
st = new StringTokenizer(br.readLine());
28+
int u = Integer.parseInt(st.nextToken());
29+
int v = Integer.parseInt(st.nextToken());
30+
union(u,v);
31+
}
32+
st = new StringTokenizer(br.readLine());
33+
int currentRoomRoot = find(Integer.parseInt(st.nextToken()));
34+
int answer = 0;
35+
36+
for (int i = 1; i < N; i++) {
37+
int nextRoomRoot = find(Integer.parseInt(st.nextToken()));
38+
if (currentRoomRoot != nextRoomRoot) {
39+
answer++;
40+
currentRoomRoot = nextRoomRoot;
41+
}
42+
}
43+
44+
System.out.println(answer);
45+
}
46+
47+
static void union(int a, int b) {
48+
int parentA = find(a);
49+
int parentB = find(b);
50+
51+
if(parentA == parentB) {
52+
return;
53+
}
54+
55+
if(parentA< parentB) {
56+
parent[parentB] = parentA;
57+
}
58+
else {
59+
parent[parentA] = parentB;
60+
}
61+
}
62+
63+
static int find(int x) {
64+
if(parent[x] !=x) {
65+
parent[x] = find(parent[x]);
66+
}
67+
return parent[x];
68+
}
69+
}

0 commit comments

Comments
 (0)