[java]트리의 부모 찾기 - 백준11725

문제



풀이

문제 해석을 하자면,

  • 입력 받는 트리의 부모 노드를 찾는 문제이다.


풀이

  • 먼저, 노드 1을 시작으로 BFS를 사용해서 높이(level tree)를 구한다.

  • 이후 출력할 때 높이 비교를 통해서 부모인지 판단한다.



코드

/**
 * 1. 노드 1을 시작으로 BFS를 사용해서 높이(level tree)를 구한다.
 * 2. 출력할 때 높이 비교를 통해서 부모인지 판단한다.
 */

static List<Integer>[] inArr = new ArrayList[100005];
static int[] level = new int[100005];
static boolean[] visited = new boolean[100005];

static void bfs() {
    // init
    Arrays.fill(level, -1);
    Queue<Integer> qu = new LinkedList<>();
    qu.add(1);
    visited[1] = true;
    level[1] = 0;

    while(!qu.isEmpty()) {
        int cur = qu.peek(); qu.remove();
        for(int nxt : inArr[cur]) {
            if(visited[nxt]) continue;
            qu.add(nxt);
            visited[nxt] = true;
            level[nxt] = level[cur] + 1;
        }
    }
}

public static void main(String[] args) throws IOException {
    // input
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer stk;
    int N = Integer.parseInt(br.readLine());
    for(int i = 0; i<=N; i++) inArr[i] = new ArrayList<>(); // init
    for(int i = 0 ;i <N-1;i++) {
        stk = new StringTokenizer(br.readLine(), " ");
        int a = Integer.parseInt(stk.nextToken());
        int b = Integer.parseInt(stk.nextToken());
        inArr[a].add(b);
        inArr[b].add(a);
    }
    // run
    bfs(); // level 구하기
    // output
    StringBuilder sb = new StringBuilder();
    for(int i = 2; i<=N; i++) {
        int root = 1000000;
        for(int nxt : inArr[i]) {
            if(level[i]-level[nxt] == 1) { // 부모인지 확인
                root = Math.min(root,nxt); // 여러 부모일 경우 최소 노드를 기억
            }
        }
        sb.append(root).append('\n');
    }
    System.out.println(sb);
}



느낀점

생략

댓글남기기