트리의부모노드찾기-1

황상익·2023년 12월 25일
0

백준

목록 보기
11/15

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class 트리의부모찾기 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(); // 노드 개수 입력

        // 트리 구조 표현을 위한 그래프 구현
        ArrayList<ArrayList<Integer>> tree = new ArrayList<>();
        for (int i = 0; i < n; i++)
            tree.add(new ArrayList<>());

        // 그래프 입력
        for (int i = 0; i < n - 1; i++) {
            int n1 = sc.nextInt() - 1;
            int n2 = sc.nextInt() - 1;
            tree.get(n1).add(n2);
            tree.get(n2).add(n1);
        }

        boolean[] visited = new boolean[n]; // 방문 여부 확인용 배열
        int[] parentNode = new int[n]; // 부모 노드 저장 배열

        // BFS
        Queue<Integer> queue = new LinkedList<>();
        queue.add(0);
        visited[0] = true;
        while (!queue.isEmpty()) {
            int v = queue.remove();
            for (int node : tree.get(v))
                if (!visited[node]) {
                    visited[node] = true;
                    queue.add(node);
                    parentNode[node] = v; // 부모 노드 찾은 후 저장
                }
        }

        // 루트 노드를 제외한 나머지 노드의 부모 노드 출력
        for (int i = 1; i < n; i++)
            System.out.println(parentNode[i] + 1);
    }

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class 트리의부모노드찾기_1 {
    static LinkedList<Integer>[] arr;
    static LinkedList<Boolean>[] visited;
    static int N;
    static HashMap<Integer, Integer> tree = new HashMap<>(); // key는 child, value는 parent
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        arr = new LinkedList[N + 1];
        visited = new LinkedList[N + 1];
        for (int i = 0; i < N + 1; i++) {
            arr[i] = new LinkedList<Integer>(); // i의 자식노드만 남기기
            visited[i] = new LinkedList<Boolean>();
        }
        for (int i = 0; i < N - 1; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int v1 = Integer.parseInt(st.nextToken());
            int v2 = Integer.parseInt(st.nextToken());
            arr[v1].add(v2);
            arr[v2].add(v1);
            visited[v1].add(false);
            visited[v2].add(false);

        }

        dfs(1);

        for (int i = 2; i <= N; i++) {
            sb.append(tree.get(i) + "\n");
        }
        System.out.print(sb.toString());

    }

    static void dfs(int parent) {

        for (int i = 0; i < arr[parent].size(); i++) {
            if (!visited[parent].get(i)) {
                int child = arr[parent].get(i);
                if (!tree.containsKey(child))
                    tree.put(child, parent); // 자식 노드 추가

                visited[parent].set(i, true);
                int parentIdx = arr[child].indexOf(parent);
                visited[child].set(parentIdx, true);
                dfs(child);
                visited[parent].set(i, false);
                visited[child].set(parentIdx, false);

            }

        }

    }

}
profile
개발자를 향해 가는 중입니다~! 항상 겸손

0개의 댓글