Algorithm
[백준] 11725: 트리의 부모 찾기 JAVA
하다보면 되겠지
2023. 2. 15. 18:27
접근
입력값은 불규칙적으로 입력되기 때문에 일단 트리의 간선 정보를 저장해둔 후 처리할 필요가 있다. 나는 Node 클래스를 만들어 연결된 다른 노드들을 저장하도록 했다. 그리고 1번, 즉 루트 노드부터 시작해서 연결된 노드들을 큐에 넣어가며 부모 정보를 저장했다.
근데 생각보다 실행 시간이 오래 걸려서 다른 사람들의 코드를 참고했더니, 알고리즘은 동일하고 StringBuilder/StringBuffer 를 사용하는 것 같았다. 출력 부분만 수정해서 재채점해본 결과 시간을 1/4로 줄일 수 있었다. 참고로, 둘의 차이점은 동기화의 유무로 알고리즘 레벨에서는 구분짓지 않고 사용해도 괜찮을 것 같다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BJ11725 {
static class Node{
int num;
ArrayList<Node> childs;
Node(int num){
this.num = num;
this.childs = new ArrayList<>();
}
void add(Node node){
this.childs.add(node);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
StringBuffer sb = new StringBuffer();
int n = Integer.parseInt(br.readLine());
Node[] tree = new Node[n+1];
for (int i = 1; i <= n; i++)
tree[i] = new Node(i);
// 입력값 저장
for (int i = 0; i < n-1; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
tree[a].add(tree[b]);
tree[b].add(tree[a]);
}
// 부모 찾기
int[] parent = makeTree(tree);
// 결과값 출력
for (int i = 2; i <= n; i++)
sb.append(parent[i]).append("\n");
System.out.println(sb);
}
private static int[] makeTree(Node[] tree) {
int[] parent = new int[tree.length];
Queue<Node> q = new LinkedList<>();
parent[1] = 1; // 1번 노드가 루트임
q.add(tree[1]);
while(!q.isEmpty()){
Node cur = q.poll();
for(Node child : cur.childs){
if(child.num == cur.num || parent[child.num] != 0) continue;
parent[child.num] = cur.num;
q.add(child);
}
}
return parent;
}
}