문제
휴대폰에서 길이가 P인 영단어를 입력하려면 버튼을 P번 눌러야 한다. 그러나 시스템프로그래밍 연구실에 근무하는 승혁연구원은 사전을 사용해 이 입력을 더 빨리 할 수 있는 자판 모듈을 개발하였다. 이 모듈은 사전 내에서 가능한 다음 글자가 하나뿐이라면 그 글자를 버튼 입력 없이 자동으로 입력해 준다! 자세한 작동 과정을 설명하자면 다음과 같다.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.
출력
각 테스트 케이스마다 한 줄에 걸쳐 문제의 정답을 소수점 둘째 자리까지 반올림하여 출력한다.
나는 Trie를 사용해 문제를 해결하였다.

Trie는 문자열을 효율적으로 저장하고 탐색하기 위한 트리 형태의 자료구조로, 문자열을 탐색할 때 단순 비교 방식보다 효율적이다. Trie는 검색어 자동 완성 기능이나 사전 검색등에 사용할 수 있다.
Trie는 비교하는 문자열의 수와 상관없이 최대 문자열 길이(L)만큼 탐색함으로 시간복잡도 O(L)를 가진다. 대신 각각의 노드들이 자식에 대한 정보를 가지고 있어야 하기 때문에 저장 공간이 크다.
1. Trie와 Node 클래스를 생성한다.
2. Trie 클래스 내에 contains 메서드에 버튼을 누르는 횟수를 저장할 cnt를 추가해 조건에 맞게 증가시켰다.
- 현재 노드의 자식이 2이상일 경우
- 현재 노드가 문자열에 마지막일 경우(Node에 isEnd 설정)
// Node
class Node {
constructor(value = "") {
this.value = value;
this.isEnd = false;
this.children = {};
}
}
// Trie
class Trie {
constructor() {
this.root = new Node();
}
insert(word) {
let currentNode = this.root;
for (const alphabet of word) {
if (!currentNode.children[alphabet]) {
currentNode.children[alphabet] = new Node(currentNode.value + alphabet);
}
currentNode = currentNode.children[alphabet];
}
currentNode.isEnd = true;
}
contains(word) {
let currentNode = this.root;
let cnt = 0;
for (const alphabet of word) {
if (currentNode.children[alphabet]) {
currentNode = currentNode.children[alphabet];
if (Object.keys(currentNode.children).length > 1) {
cnt++;
} else if (currentNode.isEnd) cnt++;
} else {
return cnt;
}
}
return cnt;
}
}
const solution = (input) => {
let idx = 0;
while (idx < input.length) {
let phone = new Trie();
let cnt = 0;
let loop = Number(input[idx]);
for (let i = idx + 1; i < idx + loop + 1; i++) {
phone.insert(input[i]);
}
for (let i = idx + 1; i < idx + loop + 1; i++) {
cnt += phone.contains(input[i]);
}
idx += loop + 1;
console.log(
(Math.round((cnt / loop + Number.EPSILON) * 100) / 100).toFixed(2)
);
}
};
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
solution(input);
다른 알고리즘 문제를 풀다가 Trie 자료구조를 알게됐다! 궁금해서 이것저것 찾아보고 공부하는 시간도 가졌다.!
잘 이해했는지 확인해 볼 겸 알고리즘 문제를 찾다가 이번 문제를 풀게 됐다..!
사실 처음에는 난이도가 높아서 당황스러웠는데 문제를 읽어보니까 공부한 내용으로 해결할 수 있을 것 같아서 도전해봤다! 물론 오래 걸렸다...!ㅎ