<백준>

- Java


* 교수님은 기다리지 않는다

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	static int N,M;
	static int[] diff;
	static int[] parent;
	
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		while(true) {
			st = new StringTokenizer(br.readLine()," ");	
			N = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			
			if(N==0 && M==0) break;
			
			diff= new int[N+1]; //차이
			parent = new int[N+1]; //무게 잰거 저장
			
			for(int i =0; i<=N; i++) {
				parent[i]=i;
			}
			
			String q;
			int a,b,w;
			
			for(int i=1; i<=M; i++) {
				st = new StringTokenizer(br.readLine()," ");
				q = st.nextToken();
				a = Integer.parseInt(st.nextToken());
				b = Integer.parseInt(st.nextToken());
				if(q.equals("!")) { //상근이가 무게 잼
					w = Integer.parseInt(st.nextToken());
					union(a,b,w);
				}else if(q.equals("?")) { //교수님이 물어보심
					if(find(a)==find(b)) { // 두 샘플 무게 쟀었는지 확인
						bw.write(diff[b]-diff[a]+"\n");
					}else { // 두 샘플 무게 잰적 없으면 차이 구 할 수 없으므로!
						bw.write("UNKNOWN"+"\n");
					}
				}
			}	
		}
		bw.flush();
		bw.close();	
	}
	
	static void union(int a, int b, int w) {
		int parentA = find(a);
		int parentB = find(b);
		//무게차이 갱신
		diff[parentB]=diff[a]-diff[b]+w;
		parent[parentB]=parentA;
	}
	
	static int find(int n) { //부모 갱신하며 n 찾음
		if(parent[n]==n) return n;
		
		int parentIndex = find(parent[n]);
		diff[n]+=diff[parent[n]];
		return parent[n]=parentIndex;
	}
}

 

union - find 문제

 

q(query)에 따라 union과 find를 실행해준다.

 

이때 diff 배열엔 무게 차이를 저장하고, parent 배열엔 부모를 저장한다.

 

q가 ! 이면 상근이가 무게를 재는 경우이므로,

union을 실행하여 무게차이를 갱신해주며 parent 설정해준다.

 

q가 ? 이면 교수가 무게 차이를 묻는 것이기 때문에 

find를 수행해 부모를 갱신하며 찾는다.

find를 통해 찾지못하면 재지 못한 경우로 무게를 차이를 구할 수 없어 unknown을 출력한다.

 

 

'모각코 > 2022_슈붕팥붕' 카테고리의 다른 글

6회차(01.20) - 결과  (0) 2022.01.20
6회차(01.20) - 목표  (0) 2022.01.20
5회차(01.18) - 목표  (0) 2022.01.18
4회차(01.13) - 결과  (0) 2022.01.13
4회차(01.13) - 목표  (0) 2022.01.13

+ Recent posts