본문 바로가기
알고리즘 문제/백준

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

by Lpromotion 2024. 8. 14.

1. 문제설명

트리의 루트를 1이라고 정했을 때, 주어진 트리에서 각 노드의 부모를 구하는 문제이다.

  • 시간 제한: 1초
  • 메모리 제한: 256MB

 

2. 접근 방식

=> DFS와 BFS 모두 풀이 가능하다.

  • 인접 리스트를 사용해 트리의 노드 정보를 저장한다.
  • 각 노드를 탐색하며 DFS를 사용해 각 노드의 부모를 저장한다.
    • 방문 체크하는 `visited` 배열 사용
    • 부모 정보 저장하는 `parent` 배열 사용

 

3. 최종 코드

import java.io.*;
import java.util.*;

public class Main {
    static int n; // 노드의 개수
    static ArrayList<Integer>[] list; // 노드 저장
    static boolean[] visited; // 방문 여부 체크
    static int[] parent; // 부모 노드 저장
    
    static void dfs(int s) {
        visited[s] = true; // 현재 노드 방문 처리
        for(int a : list[s]) { // 현재 노드와 연결된 노드 탐색
            if(!visited[a]) { // 해당 노드를 방문하지 않은 경우
                parent[a] = s; // 부모 노드 저장
                dfs(a); // 해당 노드로 재귀 호출
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        list = new ArrayList[n+1];
        visited = new boolean[n+1];
        parent = new int[n+1];
        for(int i=0; i<=n; i++) { // list 초기화
            list[i] = new ArrayList<>();
        }
        for(int i=0; i<n-1; i++) { // 연결된 정점 저장
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            // 인접리스트 형태로 노드 저장 (양방향)
            list[a].add(b);
            list[b].add(a);
        }
        
        for(int i=1; i<=n; i++) {
            // 방문하지 않은 노드일 경우 dfs 호출
            if(!visited[i]) dfs(i);
        }

        for(int i=2; i<=n; i++) {
            // 부모 노드 출력
            System.out.println(parent[i]);
        }
    }
}

 

4. 시간복잡도

노드의 개수가 N일 때, $O(N)$

반응형

댓글