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);
}
}
'BOJ' 카테고리의 다른 글
[BOJ] [JAVA] 2252번 줄 세우기 (0) | 2024.02.20 |
---|---|
[BOJ] [JAVA] 1238번 파티 (1) | 2024.02.16 |
[BOJ] [JAVA] 1753번 최단경로 (1) | 2024.02.15 |
[BOJ] [JAVA] 11003번 최소값 찾기 (1) | 2024.02.10 |
[BOJ] [JAVA] 1167번 트리의 지름 (1) | 2024.02.07 |
[BOJ] [JAVA] 14442번 벽 부수고 이동하기 2 (1) | 2024.01.27 |
[BOJ] [JAVA] 1012번 유기농 배추 (0) | 2024.01.20 |
[BOJ] [JAVA] 4779번 칸토어 집합 (1) | 2024.01.14 |