[ 트라이 ] 알고리즘

2023. 7. 22. 17:34개발/👾 PS

 

 

1.  개념

 

 

트라이 알고리즘 : 문자열 검색을 빠르게 실행할 수 있도록 설계한 트리 형태의 자료구조

 

특징

-  N진 트리 : 문자 종류의 개수에 따라 N이 결정

-  루트 노드는 항상 공백 상태

 

 

 

2.  구현

 

 

(1) 초기 설정

- 루트 노드는 공백으로 설정

(2) 단어 삽입

- 루트 노드부터 검색

- 단어를 이루는 각 알파벳에 대해

   =>  해당 알파벳이 공백 : 해당 알파벳 노드 생성

          해당 알파벳이 공백X : 해당 알파벳 노드로 이동

 

 

 

 

3.  문제

 

# 1  문자열 집합 - 백준 14425번

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

 

14425번: 문자열 집합

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

www.acmicpc.net

 

 

from sys import stdin
input = stdin.readline

# 노드 클래스 생성
class Node(object):
    def __init__(self, isEnd):
        self.isEnd = isEnd  # 마지막 문자열 여부
        self.childNode = {}  # 자식 노드


# 트라이 클래스 생성
class Trie(object):
    def __init__(self):
        self.parent = Node(None)  # parent : 부모 노드 저장 변수  ->  루트 노드는 공백

 	# 문자 삽입 함수
    def insert(self, string):
        nowNode = self.parent
        temp_length = 0
        for char in string:
        	# 자식 노드에 없는 문자면 노드 새로 생성
            if char not in nowNode.childNode:
                nowNode.childNode[char] = Node(char)
			# 자식 노드 문자로 이동
            nowNode = nowNode.childNode[char]
            temp_length += 1
            # 마지막 문자면 마지막 문자 표시
            if temp_length == len(string):
                nowNode.isEnd = True

	# 문자 찾기 함수
    def search(self, string):
        nowNode = self.parent
        temp_length = 0
        for char in string:
        	# 문자 존재하면 True 리턴
            if char in nowNode.childNode:
                nowNode = nowNode.childNode[char]
                temp_length += 1
                if temp_length == len(string) and nowNode.isEnd == True:
                    return True
            # 문자 존재하지 않으면 False 리턴
            else:
                return False
        # 문자 존재하지 않으면 False 리턴
        return False


n, m = map(int, input().split())
myTrie = Trie()  # 트라이 객체 생성

for _ in range(n):
    word = input().strip()
    myTrie.insert(word)

result = 0

for _ in range(m):
    word = input().strip()
    if myTrie.search(word):
        result += 1

print(result)

 

으어.. 어렵다..

 

'개발 > 👾 PS' 카테고리의 다른 글

📣 솔브드 그랜드 아레나 📣  (0) 2023.08.16
[ 이진 트리 ] 알고리즘  (0) 2023.07.26
[ 트리 ] 알고리즘  (0) 2023.07.19
[ 최소 신장 트리 ] 알고리즘  (0) 2023.07.19
[ 플로이드 - 워셜 ] 알고리즘  (0) 2023.07.18