본문 바로가기
문제 풀이/백준

[JAVA42] 11725. 트리의 부모 찾기

by hyeminigo 2024. 9. 30.

11725. 트리의 부모 찾기 (S2)

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 256 MB 91933 41385 29115 42.722 %

 

문제

루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다.

출력

첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.

 


summary

부모 노드 찾기

  • 루트 노드는 1

 

strategy

루트 노드(1)부터 모든 노드 탐색 (BFS, DFS)

  • 트리 구조이기 때문에 사이클 없음 (N-1 연결고리 들어옴)

 

note

  • 2 ≤ N ≤ 100,000
import java.util.*;
import java.io.*;

public class Main {

    static int N;
    static int[] parents;
    static ArrayList<Integer>[] tree;

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder answer = new StringBuilder();
        
        N = Integer.parseInt(br.readLine());

        parents = new int[N + 1];
        tree = new ArrayList[N + 1];
        for(int n = 1; n <= N; n++) {
            tree[n] = new ArrayList<Integer>();
        }
        
        for(int n = 1; n < N; n++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            tree[a].add(b);
            tree[b].add(a);
        }

        parents[1] = 1;

        DFS(1);
        
        for(int i = 2; i <= N; i++) {
            answer.append(parents[i]).append("\n");
        }
        System.out.println(answer.toString());
    }

    public static void DFS(int num) {
        for(int nextNum : tree[num]) {
            if(parents[nextNum] != 0) continue; // 이미 방문한 경우 패스

            parents[nextNum] = num;

            DFS(nextNum);
        }
    }
}

 

문제 결과 메모리 시간 언어코드 길이
11725 맞았습니다!! 69464 KB 684 ms  Java 11 / 수정 1300  B

 

memo

  • BFS 로 풀기
import java.util.*;
import java.io.*;

public class Main {

    static int N;
    static int[] parents;
    static List<Integer>[] tree;
    
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder answer = new StringBuilder();

        N = Integer.parseInt(br.readLine());
        parents = new int[N + 1];
        tree = new ArrayList[N + 1];
        for(int n = 1; n <= N; n++) tree[n] = new ArrayList<>();

        for(int n = 1; n < N; n++) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());

            tree[a].add(b);
            tree[b].add(a);
        }

        Queue<Integer> queue = new ArrayDeque<>();
        queue.add(1);
        parents[1] = 1;

        while(!queue.isEmpty()) {
            int current = queue.poll();

            for(int next : tree[current]) {
                if(parents[next] != 0) continue; // 이미 방문한 노드

                parents[next] = current;
                queue.add(next);
            }
        }

        for(int i = 2; i <= N; i++) {
            answer.append(parents[i]).append("\n");
        }

        System.out.println(answer.toString());
    }
}

'문제 풀이 > 백준' 카테고리의 다른 글

[JAVA44] 1238. 파티  (1) 2024.10.02
[JAVA43] 9251. LCS  (1) 2024.10.01
[JAVA41] 1436. 영화감독 숌  (2) 2024.09.30
[JAVA40] 2941. 크로아티아 알파벳  (0) 2024.09.29
[JAVA 39] 11279. 최대 힙  (0) 2024.09.27