[백준] 11725. 트리의 부모 찾기 (Java)

서재·2024년 3월 7일
0

백준 JAVA 풀이

목록 보기
28/36

👨‍💻 문제


✍️ 풀이

🤔 생각

양방향 그래프가 입력된다.
1번 노드가 루트 노드일 때의
각 노드들의 부모 노드를 출력해야 한다.

⛏️ DFS

1번 노드부터 방문하지 않은 연결된 노드들을 탐색하며,
해당 연결된 노드들부모 노드를 현재 노드로 기록한다.
리프 노드가 나올 때까지 연결된 노드들방문하지 않은 연결된 노드들도 방문한다.

    public static void main(String[] args) throws IOException {
		...
        
        nodeVisited = new boolean[N + 1];
        parents = new int[N + 1];
        setChildrenParent(1);
        
        ...
    }
    
    private static void setChildrenParent(int idx) {
        nodeVisited[idx] = true;

        for (int node : nodes[idx]) {

            if (!nodeVisited[node]) {
                parents[node] = idx;
                setChildrenParent(node);
            }
        }
    }

📄 전체 소스코드

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

public class _11725 {

    private static int N;
    private static List<Integer>[] nodes;
    private static boolean[] nodeVisited;
    private static int[] parents;

    public static void main(String[] args) throws IOException {

        // input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        nodes = new List[N + 1];
        for (int i=0; i<=N; i++) {
            nodes[i] = new ArrayList<>();
        }
        for (int i=0; i<N-1; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());
            nodes[from].add(to);
            nodes[to].add(from);
        }

        // dfs
        nodeVisited = new boolean[N + 1];
        parents = new int[N + 1];
        setChildrenParent(1);

        // result
        StringBuilder sb = new StringBuilder();
        for (int i=2; i<=N; i++) {
            sb.append(parents[i]);
            sb.append('\n');
        }
        System.out.print(sb);
    }

    private static void setChildrenParent(int idx) {
        nodeVisited[idx] = true;

        for (int node : nodes[idx]) {

            if (!nodeVisited[node]) {
                parents[node] = idx;
                setChildrenParent(node);
            }
        }
    }

}
profile
입니다.

0개의 댓글

관련 채용 정보