Tesseractjh
한 걸음씩
Tesseractjh
전체 방문자
오늘
어제
  • 전체 (293)
    • IT (30)
      • JavaScript (7)
      • TypeScript (5)
      • React (5)
      • Next.js (3)
      • MongoDB (2)
      • Webpack (2)
      • HTML & CSS (1)
      • Git (0)
      • AWS (1)
      • 기타 (4)
    • 연습장 (259)
      • 백준(BOJ) 문제풀이 (185)
      • 프로그래머스 문제풀이 (61)
      • LeetCode 문제풀이 (2)
      • HackerRank 문제풀이 (7)
      • 낙서장 (3)
      • 기타 (1)
    • 프로젝트 (3)
      • 지뢰피하기 (1)
      • 키릴-라틴 문자 변환기 (1)
      • Flex & Grid (1)
    • 멋쟁이사자처럼 프론트엔드 스쿨 1기 (1)
      • 일기 & 회고록 (1)

인기 글

티스토리

hELLO · Designed By 정상우.
Tesseractjh

한 걸음씩

[백준 1991 - Node.js] 트리 순회
연습장/백준(BOJ) 문제풀이

[백준 1991 - Node.js] 트리 순회

2023. 1. 12. 04:07

🔗 문제 링크

https://www.acmicpc.net/problem/1991

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파

www.acmicpc.net

✏️ 풀이

const [N, ...input] = require('fs')
  .readFileSync('/dev/stdin')
  .toString()
  .trim()
  .split('\n');

const nodes = input.map(v => v.split(' '));

class Tree {
  constructor(value) {
    this.value = value;
    this.leftNode = null;
    this.rightNode = null;
  }

  traversePreOrder(curNode = this) {
    if (!curNode) {
      return '';
    }
    const leftNodes = this.traversePreOrder(curNode.leftNode);
    const rightNodes = this.traversePreOrder(curNode.rightNode);
    return curNode.value + leftNodes + rightNodes;
  }

  traverseInOrder(curNode = this) {
    if (!curNode) {
      return '';
    }
    const leftNodes = this.traverseInOrder(curNode.leftNode);
    const rightNodes = this.traverseInOrder(curNode.rightNode);
    return leftNodes + curNode.value + rightNodes;
  }

  traversePostOrder(curNode = this) {
    if (!curNode) {
      return '';
    }
    const leftNodes = this.traversePostOrder(curNode.leftNode);
    const rightNodes = this.traversePostOrder(curNode.rightNode);
    return leftNodes + rightNodes + curNode.value;
  }
}

const trees = Array
  .from({ length: N }, (_, i) => new Tree(String.fromCharCode(i + 65)))
  .reduce((acc, tree) => {
    acc[tree.value] = tree;
    return acc;
  }, {});

nodes.forEach(([node, left, right]) => {
  if (left !== '.') {
    trees[node].leftNode = trees[left];
  }
  if (right !== '.') {
    trees[node].rightNode = trees[right];
  }
});

console.log(trees.A.traversePreOrder());
console.log(trees.A.traverseInOrder());
console.log(trees.A.traversePostOrder());

재귀를 통해 트리 순회를 구현하였다.

 

 

const [N, ...input] = require('fs')
  .readFileSync('/dev/stdin')
  .toString()
  .trim()
  .split('\n');

const nodes = input.map(v => v.split(' '));
const trees = nodes.reduce((acc, [node, left, right]) => {
    acc[node] = { left, right };
    return acc;
}, {});

const traversePreOrder = (node) => {
    if (node === '.') {
        return '';
    }
    const { left, right } = trees[node];
    return node + traversePreOrder(left) + traversePreOrder(right);
};

const traverseInOrder = (node) => {
    if (node === '.') {
        return '';
    }
    const { left, right } = trees[node];
    return traverseInOrder(left) + node + traverseInOrder(right);
};

const traversePostOrder = (node) => {
    if (node === '.') {
        return '';
    }
    const { left, right } = trees[node];
    return traversePostOrder(left) + traversePostOrder(right) + node;
};

console.log(traversePreOrder('A'));
console.log(traverseInOrder('A'));
console.log(traversePostOrder('A'));

클래스를 사용하여 트리 자료구조를 구현하지 않아도 이렇게 하면 더 간결하게 해결할 수 있다.

저작자표시 비영리 (새창열림)

'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글

[백준 2447 - Node.js] 별 찍기 - 10  (0) 2023.01.23
[백준 2470 - Node.js] 두 용액  (0) 2023.01.22
[백준 1644 - Node.js] 소수의 연속합  (0) 2023.01.12
[백준 1806 - Node.js] 부분합  (0) 2023.01.11
[백준 15565 - Node.js] 귀여운 라이언  (0) 2023.01.11
    '연습장/백준(BOJ) 문제풀이' 카테고리의 다른 글
    • [백준 2447 - Node.js] 별 찍기 - 10
    • [백준 2470 - Node.js] 두 용액
    • [백준 1644 - Node.js] 소수의 연속합
    • [백준 1806 - Node.js] 부분합
    Tesseractjh
    Tesseractjh
    바닐라 자바스크립트를 좋아하는 개발자입니다

    티스토리툴바