[boj] 1068. 트리 (node.js)

호이·2022년 2월 15일
0

algorithm

목록 보기
25/77
post-thumbnail

문제 요약

[boj] 1068. 트리 (node.js)

  • 입력: 트리의 노드의 개수 N, 0 ~ N-1번 노드의 부모 노드의 번호, 삭제할 노드 번호가 주어진다.
  • 출력: 리프 노드의 개수를 출력하라.
  • 부모가 -1이면 루트 노드이다.

풀이

  • 트리 탐색 후 리프노드의 개수를 센다.
  • dfs를 활용하여 탐색한다.

내 풀이

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let cnt = 0;
const input = () => stdin[cnt++];

let stdin = [];
rl.on("line", function (line) {
  stdin.push(line);
}).on("close", function () {
  const N = input();
  const arr = input().split(" ").map(Number);
  const erase = input();
  let tree = [];
  let root = 0;
  let cnt = 0;
  arr.forEach((elem, idx) => {
    if (elem == -1) {
      root = idx;
      return;
    }
    if (!tree[elem]) tree[elem] = [];
    tree[elem].push(idx);
  });

  const result = dfs(root);
  console.log(result);
  process.exit();

  function dfs(node) {
    if (root == erase) return 0;
    if (!tree[node]) {
      cnt++;
      return;
    }
    tree[node].forEach((elem) => {
      if (elem == erase) {
        if (tree[node].length == 1) cnt++;
        return;
      }
      dfs(elem);
    });
    return cnt;
  }
});
  • dfs 함수에서의 처리가 핵심이다.
    • root 노드에서부터 시작하므로
    • root == erase 인 경우 리프는 0개
    • root 노드가 삭제 노드가 아닌 경우는 이제 모두 for문 내에서 처리된다.
    • 자식 노드가 삭제 노드인 경우 그 부모 노드가 자식이 더 이상 없을 때만 리프 노드가 된다.
    • 그렇지 않을 경우는 모두 !tree[node] 조건에서 처리된다.
profile
매일 부활하는 개복치

0개의 댓글