이 험난한 세상에서어어~

문자열 집합 본문

algorithm/코딩 테스트

문자열 집합

토끼띠NJW 2023. 6. 28. 13:17

문제 설명

N개의 문자열로 이루어진 집합 S가 주어질 때, M개의 문자열 중 집합 S에 있는 문자는 총 몇 개인지 구하는 문제이다.

https://www.acmicpc.net/problem/14425

 

14425번: 문자열 집합

첫째 줄에 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)이 주어진다.  다음 N개의 줄에는 집합 S에 포함되어 있는 문자열들이 주어진다. 다음 M개의 줄에는 검사해야 하는 문자열들이 주어

www.acmicpc.net

난 trie 알고리즘을 연습하고 싶어서 풀었던 문제인데, 사실 굳이 trie 안 써도 되는 문제이긴한다.

문제 풀이

첫 번째 접근

trie알고리즘을 이용해서 풀었다.

trie 알고리즘이란 간단하게 말해서 문자열을 검색해주는 것인데, 나는 dic를 이용해서 그 트리를 만들었다. Trie 알고리즘에 관해서는 내가 따로 글을 쓰겠다.

 

아무튼 만들어준 trie 클래스에 값들을 넣고 1부터 m번째까지 문자열을 하나씩 받아서 만들어 놓은 trie 트리에 해당 문자열이 있으면 answer에 1을 더해줬다.

 

import sys


class trie:
    def __init__(self):
        self.root = {}

    def insert(self, word: str) -> None:
        cur = self.root # 일단 처음 루트로 맞춰준다.
        for w in word:
            if w not in cur:
                cur[w] = {}
            cur = cur[w]
        cur['*'] = ''

    def find(self, word: str) -> bool:
        cur = self.root
        for w in word:
            if w not in cur:
                return False
            cur = cur[w]
        return '*' in cur


n, m = map(int, sys.stdin.readline().rstrip().split(" "))
t = trie()
for i in range(n):
    t.insert(sys.stdin.readline().rstrip())
answer = 0
for i in range(m):
    if t.find(sys.stdin.readline().rstrip()):
        answer += 1
print(answer)

'algorithm > 코딩 테스트' 카테고리의 다른 글

문자열 지옥에 빠진 호석  (0) 2023.06.28
생태학  (0) 2023.06.28
특정한 최단 경로  (0) 2023.06.26
해킹  (0) 2023.06.26
달리기 경주  (0) 2023.06.26