5052번: 전화번호 목록
첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가
www.acmicpc.net
import sys
class TrieNode:
def __init__(self):
self.children = {}
self.is_end_of_word = False
def insert_word(root, word):
node = root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
if node.is_end_of_word:
return True # 접두사인 단어가 이미 존재
node.is_end_of_word = True
return False
def main():
input = sys.stdin.readline
n = int(input())
for _ in range(n):
m = int(input())
trie_root = TrieNode()
check = False
words = [input().rstrip() for _ in range(m)]
words.sort() # 길이 오름차순으로 정렬하여 검사
for word in words:
if insert_word(trie_root, word):
check = True
if check:
print("NO")
else:
print("YES")
if __name__ == "__main__":
main()
import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
while n != 0:
n-=1
check = False
m = int(input())
arr = deque()
for i in range(m):
arr.append(input().rstrip())
arr = deque(sorted(arr, key=len))
for idx, i in enumerate(arr):
if idx == m-1:
break
for j in range(idx+1,m):
if arr[j].startswith(i):
check = True
break
if check:
break
if check:
print("NO")
else:
print("YES")
처음 시도인데요 이렇게 하면 시간초과 나와요
챗씨한테 어떻게 시간 줄일 수 있을까 해서 얻어낸 코드가 아래 코드입니다
import sys
class TrieNode:
def __init__(self):
self.children = {}
self.is_end_of_word = False
def insert_word(root, word):
node = root
for char in word:
if char not in node.children:
node.children[char] = TrieNode()
node = node.children[char]
if node.is_end_of_word:
return True # 접두사인 단어가 이미 존재
node.is_end_of_word = True
return False
def main():
input = sys.stdin.readline
n = int(input())
for _ in range(n):
m = int(input())
trie_root = TrieNode()
check = False
words = [input().rstrip() for _ in range(m)]
words.sort() # 길이 오름차순으로 정렬하여 검사
for word in words:
if insert_word(trie_root, word):
check = True
if check:
print("NO")
else:
print("YES")
if __name__ == "__main__":
main()
이게 Trie알고리즘을 이용한건데 아마도?? 처음 봐서 신기했습니당
[Python / 파이썬] Trie 알고리즘 : 네이버 블로그 (naver.com)
210126 개발일지(50일차) - 트라이(Trie) 알고리즘 개념 및 파이썬에서 구현하기(feat. Class) (velog.io)
여기 완전 설명 자세히 돼있으니 참고하면 좋을 거 같아요
위에 저처럼 하면 시간복잡도가 O(n)인데 Trie 알고리즘 이용하면 O(m)(m은 문자열 길이)만큼 걸린대요
'BOJ' 카테고리의 다른 글
[python]백준 5430번 - AC (0) | 2023.08.21 |
---|---|
[python] 백준 4195번 - 친구 네트워크 (0) | 2023.08.20 |
[python]백준 1107번 - 리모컨 (0) | 2023.08.18 |
[python] 백준 1781번 - 컵라면 (0) | 2023.08.17 |
[python]백준 1091번 - 카드 섞기 (0) | 2023.08.16 |
댓글