Algorithm/문자열

BOJ#5670 휴대폰 자판

밤이2209 2017. 11. 26. 15:20

BOJ#5670 휴대폰 자판



* 문제



* 풀이

카카오 블라인드 채용 - 3차 코딩테스트 5번 문제와 유사합니다.


Trie를 사용하여 풀어보았습니다. 


1. 모든 문자열을 Trie에 저장한 후

2. child의 개수가 2 이상인 경우, terminal 노드인데 child가 존재하는 경우를 카운트하였습니다.


부족한 점이 있으면 댓글로 알려주세요. 감사합니다.





* 나의 코드

https://github.com/stack07142/BOJ/blob/a3f55a12084c8b798e96dd86eedbdc8661595777/BOJ%235670/src/Main.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

static final int SIZE = 26;
static int cnt = 0;

public static void main(String[] args) throws IOException {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String line;
while ((line = br.readLine()) != null) {

Trie trie = new Trie();

int N = Integer.parseInt(line);

String[] str = new String[N];

for (int i = 0; i < N; i++) {

str[i] = br.readLine();
trie.insert(str[i]);
}

for (int i = 0; i < SIZE; i++) {

if (trie.root.children[i] != null) {

trie.check(trie.root.children[i], 1);
}
}

System.out.printf("%.2f", (double) cnt / N);
System.out.println();

cnt = 0;
}


}
}

class Trie {

TrieNode root;

Trie() {

root = new TrieNode();
}

private int toNumber(char c) {

return c - 'a';
}

void insert(String key) {

int length = key.length();
TrieNode currentNode = root;

for (int i = 0; i < length; i++) {

int next = toNumber(key.charAt(i));

if (currentNode.children[next] == null) {

currentNode.children[next] = new TrieNode();
currentNode.nChild++;
}


currentNode = currentNode.children[next];
}

currentNode.isTerminal = true;
}

void check(TrieNode node, int ret) {

if (node.isTerminal) {

Main.cnt += ret;
}

if (node.nChild >= 2) {

ret++;
}

if (node.isTerminal && node.nChild == 1) {

ret++;
}

for (int i = 0; i < Main.SIZE; i++) {

if (node.children[i] != null) {

check(node.children[i], ret);
}
}

}
}

class TrieNode {

TrieNode[] children = new TrieNode[Main.SIZE];
boolean isTerminal;

int nChild = 0;

TrieNode() {

isTerminal = false;

for (int i = 0; i < Main.SIZE; i++) {

children[i] = null;
}
}
}



'Algorithm > 문자열' 카테고리의 다른 글

BOJ#5052 전화번호 목록  (0) 2017.11.25
BOJ#1152 단어의 개수  (0) 2017.05.22
BOJ#1254 팰린드롬 만들기  (0) 2017.03.31
BOJ#10942 팰린드롬?  (0) 2017.03.30