Development Palette

n3289_서로소 본문

Algorithm/SWEA

n3289_서로소

징주 2021. 8. 24. 14:19


0 a b의 형태로 입력 --> a가 포함되어 있는 집합과, b가 포함되어 있는 집합을 합친다는 의미
두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산은 1 a b의 형태로 입력
a와 b는 n 이하의 자연수이며 같을 수도 있다.
1로 시작하는 입력에 대해서 같은 집합에 속해있다면 1을, 아니면 0을 순서대로 한줄에 연속하여 출력한다.

package com.swea.w0824.n3289_서로소;

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 Solution {

	static int N; // 원소 개수
	static int[] parents; // 부모원소관리 (트리처럼사용)

	private static void make() {
		// 모든 원소를 자신을 대표자로 만듦
		for (int i = 1; i <= N; i++) {
			parents[i] = i;
		}
	}

	private static int find(int a) {
		if (a == parents[a])
			return a; // 자신이 대표자일 때는 자신을 리턴
		return parents[a] = find(parents[a]); // 자신이 속한 집합의 대표쟈를 자신의 부모로 : path compression
	}

	// 두 원소를 하나의 집합으로 합치기(대표자를 이용해 합침)
	private static boolean union(int a, int b) {
		int aRoot = find(a);
		int bRoot = find(b);

		parents[bRoot] = aRoot; // b의 부모를 a로 삼다
		return true; // 합쳤으면 true
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int T = Integer.parseInt(br.readLine());

		for (int t = 1; t <= T; t++) {
			StringBuilder sb = new StringBuilder();
			sb.append("#" + t + " ");

			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken()); // 1~N
			int M = Integer.parseInt(st.nextToken()); // 연산
			parents = new int[N + 1];

			make(); // 원소 집합 만들기

			for (int i = 0; i < M; i++) {
				st = new StringTokenizer(br.readLine());

				int find_union = Integer.parseInt(st.nextToken()); // 0이면 union, 1이면 find
				int a = Integer.parseInt(st.nextToken());
				int b = Integer.parseInt(st.nextToken());

				if (find_union == 0) {
					union(a, b);	//a집합, b집합 합침
				}
				else if (find_union == 1) {

					if (find(a) == find(b)) {
						sb.append("1");		//같은 집합이면 1출력
					} else
						sb.append("0");	////다른 집합이면 0출력
				}
			}

			bw.append(sb+"\n");
		}
		bw.flush();

		bw.close();
	}

}

 

... 테케가 하나라서 줄바꿈하는 걸 잊어먹었다.. 그래서 계속 Fail 됐음.. 다음에도 테케 하나 나올 때는 주의하자@!!!

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

'Algorithm > SWEA' 카테고리의 다른 글

s5215_햄버거다이어트  (0) 2021.09.26
n7465_창용 마을 무리의 개수  (0) 2021.08.24
[D4] n1223_계산기2  (0) 2021.08.20
[D3] n6808_규영이와인영이의카드게임  (0) 2021.08.14
[D3] n9229 한빈이와 Spot Mart;  (0) 2021.08.10
Comments