Algorithm PS/Baekjoon Online Judge

[BOJ/백준] 11725 트리의 부모 찾기 (S2)

kyung.Kh 2024. 7. 23. 18:58

문제

https://www.acmicpc.net/problem/11725

풀이

해당 문제는 루트 없는 트리에서 각 노드의 부모를 찾아야 한다. 트리의 루트를 1로 정했을 때, 각 노드의 부모를 구하여 출력해야 한다.

 

우선 노드의 개수인 N을 입력받고, 이후 N-1개의 줄에서 두 노드의 연결 정보를 인접 리스트 구조로 입력는다.

그리고 DFS를 시작하여 루트 노드(1)를 방문 처리하고, 연결된 모든 노드를 탐색하면서 각 노드의 부모 노드를 찾는다. DFS는 재귀적으로 호출되며, 현재 노드를 방문 처리하고, 연결된 노드 중 방문하지 않은 노드를 탐색하면서 부모 노드를 설정한다. 모든 노드의 부모를 찾은 후, 2번 노드부터 순서대로 부모 노드를 출력한다. 

Code

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {

    static int N;
    static List<List<Integer>> adjList;  // 인접 리스트
    static boolean[] visited;
    static int[] parents;  // 부모

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

        N = Integer.parseInt(br.readLine());

        adjList = new ArrayList<>();  // 인접 리스트 생성
        for (int i = 0; i <= N; i++) {
            adjList.add(new ArrayList<>());
        }
        visited = new boolean[N + 1];
        parents = new int[N + 1];

        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());
            adjList.get(a).add(b);
            adjList.get(b).add(a);
        }

        dfs(1); // 루트 노드를 1로 설정하고 시작

        for (int i = 2; i <= N; i++) {
            bw.write(parents[i] + "\n");
        }
        bw.flush(); bw.close();
    }

    private static void dfs(int now) {
        visited[now] = true;  // 현재 노드를 방문 처리

        // 인접 리스트 순회
        for (int node : adjList.get(now)) {
            if (!visited[node]) {  // 방문하지 않은 노드라면?
                parents[node] = now;  // 인접 노드의 부모를 현재 노드로 설정하고
                dfs(node);// 인점 노드 방문
            }
        }
    }
}

728x90