• 문제 링크
14426번: 접두사 찾기
문자열 S의 접두사란 S의 가장 앞에서부터 부분 문자열을 의미한다. 예를 들어, S = "codeplus"의 접두사는 "code", "co", "codepl", "codeplus"가 있고, "plus", "s", "cude", "crud"는 접두사가 아니다. 총 N개의 문자
www.acmicpc.net
• 풀이 과정
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
Trie trie = new Trie();
while (n-- > 0)
trie.insert(br.readLine());
int cnt = 0;
while (m-- > 0) {
if (trie.startsWith(br.readLine()))
cnt++;
}
bw.write(String.valueOf(cnt));
bw.flush();
}
private static class TrieNode {
Map<Character, TrieNode> child;
boolean isWord;
public TrieNode() {
child = new HashMap<>();
isWord = false;
}
}
private static class Trie {
TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
TrieNode node = root;
for (char c : word.toCharArray()) {
node.child.computeIfAbsent(c, t -> new TrieNode());
node = node.child.get(c);
}
node.isWord = true;
}
public boolean startsWith(String prefix) {
TrieNode node = root;
for (char c : prefix.toCharArray()) {
if (!node.child.containsKey(c))
return false;
node = node.child.get(c);
}
return true;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 9575 행운의 수 - Data Structure / Java (0) | 2023.04.26 |
---|---|
[백준] 16499 동일한 단어 그룹화하기 - Data Structure / Java (0) | 2023.04.25 |
[백준] 7662 이중 우선순위 큐 - Data Structure / Java (0) | 2023.04.23 |
[백준] 4677 Oil Deposits - Graph Theory / Java (0) | 2023.04.22 |
[백준] 10552 DOM - Graph Theory / Java (0) | 2023.04.21 |
댓글