Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

코드와이

[BAEKJOON] 10775. 공항 본문

acmicpc

[BAEKJOON] 10775. 공항

코드와이 2021. 10. 10. 23:04

Kruskal

 

문제링크

https://www.acmicpc.net/problem/10775

 

10775번: 공항

예제 1 : [2][?][?][1] 형태로 도킹시킬 수 있다. 3번째 비행기는 도킹시킬 수 없다. 예제 2 : [1][2][3][?] 형태로 도킹 시킬 수 있고, 4번째 비행기는 절대 도킹 시킬 수 없어서 이후 추가적인 도킹은 불

www.acmicpc.net

 

최선의 방법을 위해선 각 비행기가 도킹할 수 있는 게이트의 숫자가 최댓값이 되어야 한다.

예) plane : 5 => gate : 5    // 5번 게이터가 막혀있다면 4, 3, 2, 1 이런 식으로 게이트 할당

Kruskal 알고리즘을 활용해서 최선의 방법으로 비행기가 들어가야할 게이트를 지정해준다.

그렇게 해서 찾은 게이트 번호가 0번이라면 공항 폐쇄.

 

package acmicpc.Gold2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class 공항 {
	
	static int n, m, parent[];
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		n = Integer.parseInt(br.readLine());
		m = Integer.parseInt(br.readLine());
		
		parent = new int[n + 1];
		
		for(int i = 1 ; i <= n ; i++) {
			parent[i] = i;
		}
		
		int ans = 0;
		for(int i = 0 ; i < m ; i++) {
			
			int p = Integer.parseInt(br.readLine());
			int pSet = findSet(p);
			
			if(pSet == 0) break;
			
			ans++;
			union(pSet, pSet - 1);
		}
		
		System.out.println(ans);
	}
	
	public static int findSet(int x) {
		if(x == parent[x]) return x;
		
		return parent[x] = findSet(parent[x]);
	}
	
	public static void union(int a, int b) {
		
		int aSet = findSet(a);
		int bSet = findSet(b);
		
		if(aSet == bSet) return;
		
		parent[aSet] = bSet;
		
	}
}

Kruskal 알고리즘을 이런식으로도 사용할 수 있다는 것에 감탄했다....

'acmicpc' 카테고리의 다른 글

[BAEKJOON] 2665. 미로 만들기  (0) 2021.10.16
[BAEKJOON] 17406. 배열 돌리기4  (0) 2021.10.16
[BAEKJOON] 4386. 별자리 만들기  (0) 2021.10.10
[BAEKJOON] 1939. 중량 제한  (0) 2021.10.09
[BAEKJOON] 17825. 주사위 윷놀이  (0) 2021.09.26