[14425] 문자열 집합 (트라이, Trie)

2023. 6. 5. 17:32·Coding Test/Tree
728x90
 

14425번: 문자열 집합

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

www.acmicpc.net

 

 

트라이

  • 문자열 검색을 빠르게 실행할 수 있도록 설계한 트리 형태의 자료구조
  • 특징
    • N진트리 : 문자 종류의 개수에 따라 N이 결정됨. 예를 들어 알파벳은 26개의 문자로 이뤄져있으므로 26진트리로 구성됨.
    • 루트 노드는 항상 빈 문자열을 뜻하는 공백 상태를 유지
  • 시간복잡도
    • 문자열의 길이가 m이라면 시간 복잡도는 O(m)
    • 현재 노드의 위치를 i, j번째 문자라고 한다면 trie[i][j]의 위치를 조회하는 건 O(1)에 수행 가능
    • 문자열의 길이만큼, 즉 m번을 수행하니 O(m)의 시간 소요

 

 

풀이

import sys
input=sys.stdin.readline

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

class Trie(object):
    def __init__(self):
        self.parent=Node(None)  # 부모노드 저장 변수

    # 문자 삽입
    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:
            if char in nowNode.childNode:
                nowNode=nowNode.childNode[char]
                temp_length+=1
                # 마지막 문자까지 모두 존재하고 마지막 문자에 isEnd가 True인 경우
                if temp_length==len(string) and nowNode.isEnd==True:
                    return True
            else:
                return False
        return False


n,m=map(int,input().split())
myTrie=Trie()  # Trie 생성

# 문자열 삽입
for _ in range(n):
    word=input().strip()
    myTrie.insert(word)   # 단어 삽입

# 문자열 찾기
cnt=0
for _ in range(m):
    word=input().strip()
    if myTrie.search(word):  # 단어찾기
        cnt+=1

print(cnt)

 

더보기

 

 

[14425] 문자열 집합 (set)

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

karla.tistory.com

 

더보기

참고

 

트라이(Trie) 자료구조

Trie란 트라이는 실무에 매우 유용하게 쓰이는 트리 형태의 자료구조로서, 특히 자연어 처리(NLP)분야에서 문자열 탐색을 위한 자료구조로 널리 쓰입니다.트라이는 검색을 뜻하는 'retrieval'의 중간

velog.io

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'Coding Test/Tree' 카테고리의 다른 글
  • [11505] 구간 곱 구하기 (세그먼트 트리)
  • [10868] 최솟값 (세그먼트 트리)
  • [11437] 최소 공통 조상 (트리, 일반 LCA)
  • [1068] 트리 (리프 노드의 개수 구하기, DFS)
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이썬
    플로이드워셜
    그래프
    동적계획법
    알고리즘
    월간코드챌린지
    큐
    재귀
    BFS
    프로그래머스
    조합
    DP
    그리디
    자료구조
    최대공약수
    DFS
    덱
    최단거리
    다익스트라
    트리
    Algorithm
    구간합
    이분탐색
    스택
    정렬
    구현
    힙
    LIS
    백준
    최소신장트리
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[14425] 문자열 집합 (트라이, Trie)
상단으로

티스토리툴바