출처 : https://www.acmicpc.net/problem/19585
import sys
input = sys.stdin.readline
c, n = map(int, input().split())
tree_c = dict()
set_n = set()
def insert(tree, word) :
cur = tree
for char in word :
if char not in cur :
cur[char] = dict()
cur = cur[char]
cur["*"] = len(word)
def startswith(tree, word) :
cur = tree
for char in word :
if char not in cur :
return False
cur = cur[char]
if "*" in cur :
idx = cur['*']
if word[idx:] in set_n :
return True
for _ in range(c) :
color = input().rstrip()
cur = tree_c
insert(tree_c, color)
for _ in range(n) :
name = input().rstrip()
set_n.add(name)
q = int(input())
for _ in range(q) :
team = input().rstrip()
if startswith(tree_c, team) :
print("Yes")
else :
print("No")
먼저 트라이(Trie)를 활용한 풀이.
색상은 딕셔너리로 구현한 트라이에 넣고, 닉네임은 set에 넣는다.
트라이의 마지막에는 색상 단어의 길이를 저장한다.
팀명을 트라이에 넣어서 접두사로 일치하는 색상이 있으면, 색상의 길이만큼 앞에서 잘라낸 팀명이 닉네임 set 안에 있는지 확인한다.
이때 일치하는 색상이 여럿 있을 수 있으니(ex 색상 : aa, aab / 팀명 : aabxx) 팀명의 끝까지 탐색해야한다.
정답 제출 후 다른 사람의 코드를 보니 트라이 필요가 없더라...
색상과 닉네임 각각 set에 넣어주고 팀명의 앞에서부터 앞뒤로 쪼개가며 set에 일치하는 값이 있는지 찾아준다.
다른 언어에서도 가능할지는 모르겠다.
import sys
input = sys.stdin.readline
c, n = map(int, input().split())
set_c = set()
set_n = set()
for _ in range(c) :
set_c.add(input().rstrip())
for _ in range(n) :
set_n.add(input().rstrip())
q = int(input())
for _ in range(q) :
team = input().rstrip()
l = len(team)
answer = "No"
for i in range(max(1, l - 1000), min(1001, l)) :
if team[:i] in set_c and team[i:] in set_n :
answer = "Yes"
break
print(answer)
'알고리즘 문제 풀이' 카테고리의 다른 글
백준 24519번 : Bottleneck TSP (Large) (Python) (0) | 2023.03.24 |
---|---|
백준 13701번 : 중복 제거 (Python) (0) | 2023.03.20 |
백준 1991번 : 트리 순회 (Python) (비재귀 반복문) (0) | 2023.03.03 |
백준 13904번 : 과제 (Python) (0) | 2023.02.26 |
프로그래머스 롤케이크 자르기 (0) | 2023.01.25 |
댓글