본문 바로가기
Problem Solving/Baekjoon

[백준] 14426 접두사 찾기 - Data Structure / Java

by graycode 2023. 4. 24.

 문제 링크

 

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;
        }
    }

}

댓글