문제 출처
https://www.acmicpc.net/problem/14725
정답 풀이
문자열 문제를 풀고 싶었는데, 어쩌다 보니 트리 알고리즘을 연습하게 됐다.
뭐, 잘됐다. 트리 문제는 한번 풀어본 것 같다..;; (아무래도 양심이 없다)
트리 문제는 언제나 간단하게 생각하면 된다.
- 트리를 어떻게 생성할까?
- 트리를 어떻게 탐색할까?
이 두개만 생각해주면 된다.
그러다 보니, 아래와 solution 함수가 쉬워진다.
생성은 insert 를 통해,
탐색은 print를 통해 구현하면 된다.
## insert
path는 문제에서 주어진 값이 차례대로 들어갈 것이다.
2 B A
4 A B C D
2 A C
내 전체 코드를 보면, 앞에 숫자는 slice(1)를 통해 없앴고, 배열로 구현해놨다.
아래와 같은 모습이 되고, 각각의 배열이 path가 된다.
[
[B,A]
[A,B,C,D]
[A,C]
]
만약 현재 rootNode에 path를 반복문 돌렸을 때의 각 node가 없다면 새롭게 Tree를 생성해주는 코드다.
그리고 다음 node는 현재 Tree의 next가 된다.
이제 print는 우리가 생성해준 트리를 문제가 원한대로 출력을 해줘야 한다.
트리의 깊이? 여기서 indent에 따라 '-'의 개수가 결정된다.
처음엔 0개
다음엔 2개
그다음엔 4개
따라서 코드를 보면 indent가 +2개씩 늘어나는 것을 확인할 수 있다.
그리고, 문제에서 문자 정렬대로 출력하기를 원했다. 따라서 현재 트리에서 next의 모든 노드의 key를 기준으로 정렬을 한다.
그리고 그 해당 키를 출력 후, 해당 노드의 다음 노드로 바로 탐색을 들어간다.
정답 코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
const n = Number(input.shift());
let arr = [];
for(let i=0; i<n; i++){
arr.push(input[i].split(' ').slice(1))
}
class Tree{
constructor(val){
this.val = val;
this.next = {};
}
insert(path){
let current = this;
for(let node of path){
if(!current.next[node]){
current.next[node] = new Tree(node);
}
current = current.next[node];
}
}
print(indent = 0){
const keys = Object.keys(this.next).sort();
for(let key of keys){
console.log('-'.repeat(indent) + key);
this.next[key].print(indent+2)
}
}
}
function solution(n,arr){
let rootTree = new Tree('root');
for(let i=0; i<n; i++){
rootTree.insert(arr[i])
}
rootTree.print();
}
solution(n,arr)
'알고리즘 문제 풀기' 카테고리의 다른 글
프로그래머스: [PCCP 기출문제] 1번 동영상 재생기 - javascript(단순 구현) (0) | 2024.09.12 |
---|---|
프로그래머스: [PCCP 기출 문제] 석유 시추 - javascript(bfs 효율성) (0) | 2024.09.11 |
백준 2293: 동전 1 - javascript(dp) (1) | 2024.09.05 |
백준 2638: 치즈 - javascript(bfs) (0) | 2024.09.04 |
프로그래머스: 블록 이동하기 - javascript(bfs 끝장내기) (0) | 2024.09.04 |