Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_3584] 가장 가까운 공통 조상 본문

Study/Problem Solving

[BOJ_3584] 가장 가까운 공통 조상

monitor 2023. 12. 24. 15:31

설명


진작 맞추고 ==을 써서 틀렸었던 문제다. Integer와 같이 Wrapper class의 비교가 필요할때는 equals로 비교를 하는 것이 안전 한 것 같다. ==을 쓰면 아래 코드의 이 중 포문에서 node.get(i) == node2.get(j) 를 쓰면 25%에서 무조건 틀렸습니다가 뜬다. 그래서, 다른 사람 풀이를 참고했는데 사실상 다를 것이 없어서 일일이 넣어보면서 찾아냈는데 equals를 사용하니 맞았다.

 

우선, 코드 자체는 dfs로 아래 두 정점에 대해서 각 부모를 탐색해서 올라가는 식으로 구현하였다. 이런식으로 구현하면 처음 만나는 부모 노드가 가장 깊이가 깊은 노드이므로 별도의 신경을 쓰지 않고 구현 할 수 있다.

 

코드


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    static int[] visited;
    static List<Integer>[] listNode;
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");
        int T = Integer.parseInt(tk.nextToken());
        List<Integer> node,node2;
        while (T-- > 0){
            tk = new StringTokenizer(in.readLine()," ");
            int N = Integer.parseInt(tk.nextToken());
            visited = new int[N + 1];
            node = new ArrayList<>();
            node2 = new ArrayList<>();
            listNode = new ArrayList[N + 1];
            for (int i = 0; i < listNode.length; i++){
                listNode[i] = new ArrayList<>();
            }
            for (int i = 1; i < N; i++){
                tk = new StringTokenizer(in.readLine()," ");
                int a = Integer.parseInt(tk.nextToken());
                int b = Integer.parseInt(tk.nextToken());
                listNode[b].add(a);
            }
            tk = new StringTokenizer(in.readLine()," ");
            int a = Integer.parseInt(tk.nextToken());
            int b = Integer.parseInt(tk.nextToken());
            node.add(a);
            dfs(a,node);
            visited = new int[N + 1];
            node2.add(b);
            dfs(b,node2);

            loop : for (int i = 0; i < node.size(); i++){
                for (int j = 0; j < node2.size(); j++){
                    if (node.get(i).equals(node2.get(j))) {
                        System.out.println(node.get(i));
                        break loop;
                    }
                }
            }
        }
    }

    private static void dfs(int idx, List<Integer> node){
        visited[idx] = 1;
        for (int parent : listNode[idx]){
            if(visited[parent] == 0){
                visited[parent] = 1;
                node.add(parent);
                dfs(parent,node);
            }
        }
    }
}
 

3584번: 가장 가까운 공통 조상

루트가 있는 트리(rooted tree)가 주어지고, 그 트리 상의 두 정점이 주어질 때 그들의 가장 가까운 공통 조상(Nearest Common Anscestor)은 다음과 같이 정의됩니다. 두 노드의 가장 가까운 공통 조상은, 두

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_4256] 트리  (1) 2023.12.28
[BOJ_9489] 사촌  (0) 2023.12.25
[BOJ_1967] 트리의 지름  (1) 2023.12.23
[BOJ_17073] 나무 위에 빗물  (1) 2023.12.19
[BOJ_20924] 트리의 기둥과 가지  (0) 2023.12.19