> 문제
문제 : [자동완성 2018 카카오 문제]
> 문제풀이
Trie 자료구조를 구현하여 풀이하였다.
입력해야 할 문자의 수는 dfs로 탐색하였으며,
cnt가 1이거나 마지막 문장인 경우(lastChar==true)의 depth를 결과값에 더해가며 풀이하였다.
cnt가 1인경우는 문장이 하나밖에 없기 때문에 더이상 탐색할 필요가 없으며,
마지막 문장인 경우(lastChar==true)에는 이어서 문장이 더 있을 수 있기 때문에 더 탐색한다.
소스는 다음과 같다.
import java.util.*;
class Solution {
static class Trie{
private Node root;
public Trie(){
this.root = new Node();
}
public void append(String word){
Node node = this.root;
char c = ' ';
for(int i=0; i<word.length(); i++){
c = word.charAt(i);
if(node.child.get(c) == null){
node.child.put(c, new Node());
}
node = node.child.get(c);
node.cnt++;
if(i==word.length()-1) node.lastChar = true;
}
}
static int res;
public int calLengthStr(){
dfs(0, this.root);
return res;
}
public void dfs(int depth, Node node){
if(node.cnt == 1){
res += depth;
return;
}
if(node.lastChar == true) {
res += depth;
}
Iterator<Character> it = node.child.keySet().iterator();
while(it.hasNext()){
char c = it.next();
dfs(depth+1, node.child.get(c));
}
}
static class Node{
int cnt;
Map<Character, Node> child;
boolean lastChar;
public Node(){
this.child = new HashMap<>();
}
}
}
public int solution(String[] words) {
Trie trie = new Trie();
for(int i=0; i<words.length; i++){
trie.append(words[i]);
}
int answer = trie.calLengthStr();
return answer;
}
}
문제 출처 : Programmers