본문 바로가기
BOJ

[BOJ] [JAVA] 31423번 신촌 통폐합 계획

by Parsler 2024. 2. 21.
 

31423번: 신촌 통폐합 계획

첫 번째 줄에 대학교의 개수 $N$이 주어진다. $(2 \leq N \leq 500 \, 000)$ 다음 $N$개의 줄의 $i$번째 줄에 대학교 이름을 의미하는 알파벳 소문자로 이루어진 문자열 $s_i$가 주어진다. 주어지는 대학교

www.acmicpc.net

Union Find에서 Path Compression과 방식이 유사한 것 같아 작성한다. (아닐수도,,,)

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

public class Main {
   
    static String[] str;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());

        str = new String[n + 1];
        
        for (int i = 1; i <= n; i++) str[i] = br.readLine();
        
        // 자신의 바로 오른쪽 노드 정보
        int [] right = new int[n + 1];
        
        // 같은 집합에 속해있는 원소 중 가장 오른쪽에 있는 노드 정보
        int [] child = new int[n + 1];
        
        for (int i = 0; i < n - 2; i++) {
           st = new StringTokenizer(br.readLine());
           int a = Integer.parseInt(st.nextToken());
           int b = Integer.parseInt(st.nextToken());
           
           // a가 가장 오른쪽이었다면
           if (right[a] == 0) {
              right[a] = b;
           } 
           // a의 바로 오른쪽에 노드가 이미 존재한다면
           // a의 가장 오른쪽을 바꿔준다.
           else {
              right[child[a]] = b;
           }
           // 자식(가장 오른쪽) 정보 갱신
           if (child[b] == 0) {
              child[a] = b;
           } else child[a] = child[b];

        }
        
        st = new StringTokenizer(br.readLine());
       int a = Integer.parseInt(st.nextToken());
       int b = Integer.parseInt(st.nextToken());
       
       if (right[a] == 0) {
          right[a] = b;
       } else {
          right[child[a]] = b;
       }
       if (child[b] == 0) {
          child[a] = b;
       } else child[a] = child[b];
       
       while (right[a] != 0) {
          sb.append(str[a]);
          a = right[a];
       }
       sb.append(str[a]);
       System.out.println(sb);
    }
}