티스토리 뷰
https://www.acmicpc.net/problem/24391
24391번: 귀찮은 해강이
첫째 줄에 강의의 개수 N(1 ≤ N ≤ 105)과 연결되어 있는 건물의 쌍의 개수 M(0 ≤ M ≤ 105)이 공백으로 구분되어 주어진다. 두 번째 줄부터는 M줄에 걸쳐 i와 j(1 ≤ i, j ≤ N)가 주어진다. 이는 i번 건
www.acmicpc.net

문제
해강이는 앙중대학교에 다닌다. 해강이는 이번 학기에 강의코드 1번부터 N번까지 N개의 강의를 듣고 있다.
모든 강의는 강의코드와 동일한 번호의 건물에서 진행된다. 예를 들어, 강의코드가 1인 강의는 1번 건물에서 진행되고, 강의코드가 N-1인 강의는 N-1번 건물에서 진행된다.
해강이는 밖에 나오는 것을 싫어해서, 강의 시간표 순서대로 모든 강의를 들으면서 한 건물에서 밖으로 나와서 다른 건물로 이동하는 횟수를 최소화하고 싶다. 앙중대학교에는 다행히도 서로 연결되어 있는 건물들이 있어, 이 건물끼리는 밖으로 나오지 않고 이동할 수 있다.
해강이의 강의 시간표가 주어질 때, 밖에 나오는 것을 싫어하는 해강이를 위해 최소 몇 번만 밖에 나오면 되는지 구해보자. 맨 처음 강의를 들으러 이동하는 횟수는 세지 않는다.
유형 : Union - Find
접근 방식
- 연결된 건물끼리의 이동 횟수는 0이다. -> 분리 집합을 통해 연결된 건물들을 1개로 관리할 수 있어야 한다.
- 연결이 입력될 때마다 Union - Find를 통해 건물을 연결한다.
- 마지막에 전체 노드의 개수만큼 find() 함수를 수행해줘야 하는데 그 이유는 다음과 같다.
- 아래쪽에 연결이 완성되고 다시 위쪽의 입력이 주어진 경우 아래쪽 노드들의 부모가 초기화되지 않는다.
전체 코드
import java.util.*;
import java.io.*;
public class Main {
static int n,m;
static int[] root;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
root = new int[n+1];
for(int i = 1 ; i <= n ; i++){
root[i] = i;
}
for(int i = 1 ; i <= m ; i++){
st = new StringTokenizer(br.readLine()," ");
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
if(find(v1) != find(v2)){
union(v1,v2);
}
}
for(int i = 1 ; i <= n ; i++){
find(i);
}
int[] board = new int[n];
st = new StringTokenizer(br.readLine()," ");
for(int i = 0 ; i < n ; i++){
board[i] = Integer.parseInt(st.nextToken());
}
int count = 0;
for(int i = 1 ; i < n ; i++){
if(root[board[i]] != root[board[i-1]])
count++;
}
System.out.println(count);
br.close();
}
static void print(){
for(int i = 1 ; i <= n ; i++){
System.out.print(root[i]+" ");
}
System.out.println();
}
static int find(int x){
if(x == root[x])
return root[x];
return root[x] = find(root[x]);
}
static void union(int x,int y){
x = find(x);
y = find(y);
if(x < y)
root[y] = x;
else
root[x] = y;
}
}'알고리즘 > 백준' 카테고리의 다른 글
| 백준 13907 (세금) - java (0) | 2024.04.25 |
|---|---|
| 백준 10776 (제국) - java (0) | 2024.04.24 |
| 백준 16118 (달빛 여우) java (1) | 2024.04.21 |
| 백준 2632 (피자판매) - java (0) | 2024.04.15 |
| 백준 17143 (낚시왕) - java (0) | 2024.04.02 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #치즈 #2638
- 백준 #3980 #선발 명단
- 백준 #1325 #효율적인 해킹
- 백준 #18405 #경쟁적 전염
- 백준 #4963 #섬의 개수
- 백준 #15686 #치킨 배달
- 백준 #인구 이동 #16234
- 백준 #1584 #게임 #java #자바
- 자바
- 행복합시다.
- 백준 #13549 #숨바꼭질3
- 올해보다
- 백준 #1987 #알파벳 #자바 #java
- 백준 #1759 #암호 만들기
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 백준 #17940 #주식 #자바 #java
- 백준 #16973 #직사각형 탈출
- 백준 #다리 만들기 #2146
- 백준 #2636 #치즈
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 17218
- 자바 #JAVA
- 백준 #2580 #스도쿠
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준 #12014 #주식 #자바 #java
- 백준 #25603 #짱해커 이동식 #java #자바
- 17394
- 백준 #
- Java
- 백준
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함