안녕하세요 이번 시간에는 트라이(trie)에 대해 알아보는 시간을 갖도록 하겠습니다.
트라이란 문자열 검색을 빠르게 실행할 수 있도록 설계한 트리 형태의 자료 구조입니다. 단어들을 사전의 형태로 생성한 후 트리의 부모 자식 노드 관계를 이용하여 검색을 수행합니다.
트라이를 생성하는 방식은 다음과 같습니다.
트라이에서 단어를 읽는 방식은 다음과 같습니다.
백준 14425(문자열 집합) 문제를 통해 트라이를 구현해보겠습니다. N개의 문자열 집합 S에 입력으로 주어지는 M개의 문자열 중 포함되어 있는 것이 몇 개인지를 구하는 문제입니다. 각 단어가 영어로 주어져있기 때문에 알파벳 개수인 26진 트리의 트라이를 구현합니다.
import java.util.*;
import java.io.*;
class Main{
static int N,M;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
Node root = new Node();
while(N-- >0){
String word = br.readLine();
Node curr = root;
for(int i=0;i<word.length();i++){
int idx = word.charAt(i) - 'a';
if(curr.next[idx] == null) curr.next[idx] = new Node();
curr = curr.next[idx];
if(i == word.length()-1) curr.isEnd = true;
}
}
int cnt = 0;
while(M-- >0){
String word = br.readLine();
Node curr = root;
for(int i=0;i<word.length();i++){
int idx = word.charAt(i) - 'a';
if(curr.next[idx] == null) break;
curr = curr.next[idx];
if(i == word.length()-1 && curr.isEnd) cnt++;
}
}
System.out.println(cnt);
}
static class Node{
Node[] next = new Node[26];
boolean isEnd;
}
}