(1) startswith : 시간복잡도 = 636ms
import sys
# 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)
N,M = map(int,sys.stdin.readline().rstrip().split())
s = []
m = []
for _ in range(N) :
s.append((sys.stdin.readline().rstrip()))
for _ in range(M) :
m.append((sys.stdin.readline().rstrip()))
answer = 0
for i in range(M) :
for j in range(N) :
if s[j].startswith(m[i]):
answer+=1
break
print(answer)
(2) 해시테이블 느낌과 비슷하게 구현 :
import string
import sys
# 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)
N,M = map(int,sys.stdin.readline().rstrip().split())
s = words = {x: [] for x in string.ascii_lowercase}
m = []
for _ in range(N) :
word=(sys.stdin.readline().rstrip())
s[word[0]].append(''.join(word))
for _ in range(M) :
m.append((sys.stdin.readline().rstrip()))
answer = 0
for i in range(M) :
for j in s[m[i][0]] :
if j.startswith(m[i]):
answer+=1
break
print(answer)
import sys
# 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)
N,M = map(int,sys.stdin.readline().rstrip().split())
s = []
m = []
for _ in range(N) :
s.append(list(sys.stdin.readline().rstrip()))
for _ in range(M) :
m.append(sys.stdin.readline().rstrip())
answer = 0
for i in range(M) :
for j in range(N) :
if m[i]=="".join(s[j][0:len(m[i])]):
answer+=1
break
print(answer)
import sys
# 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)
N,M = map(int,sys.stdin.readline().rstrip().split())
s = []
m = []
for _ in range(N) :
s.append(list(sys.stdin.readline().rstrip()))
for _ in range(M) :
m.append(list(sys.stdin.readline().rstrip()))
answer = 0
for i in range(M) :
for j in range(N) :
if m[i] == (s[j][0:len(m[i])]):
answer+=1
break
print(answer)
startwith 함수
사전에 내가 원하는 키/value 값 설정 방법
words = {x: [] for x in string.ascii_lowercase}
=> 'a':[], 'b':[] ,,, 같이 생성됩니다.
파이썬으로 트라이 구조 만들기
import sys
read = sys.stdin.readline
# 아래의 Node, Trie class 구현 부분은
# [https://alpyrithm.tistory.com/74]
# 알파이님의 블로그를 토대로 작성했습니다.
class Node(object):
# trie 자료구조를 위한 node
def __init__(self, key, data=None):
self.key = key
self.data = data
# dictionary 자료구조 사용
self.children = {}
class Trie(object):
def __init__(self):
self.head = Node(None)
# 문자열 삽입
def insert(self, string):
curr_node = self.head
# 삽입할 string 각각의 문자에 대해 자식 Node를 만들며 내려간다.
for char in string:
# 자식 Node들 중 같은 문자가 없으면 Node 새로 생성
if char not in curr_node.children:
curr_node.children[char] = Node(char)
# 같은 문자가 있으면 해당 노드로 이동
curr_node = curr_node.children[char]
curr_node.data = string
# 문자열이 존재하는지 search
def search(self, string):
curr_node = self.head
for char in string:
if char in curr_node.children:
curr_node = curr_node.children[char]
else:
return False
if curr_node.data != None:
return True
n, m = map(int, read().split())
word_trie = Trie()
word_len = list(False for _ in range(501))
# 주어진 문자열과 길이가 같은 문자열에 대해서만 탐색을 진행해
# 시간복잡도 줄이기 위함
for _ in range(n):
word = read().strip()
word_trie.insert(word)
word_len[len(word)] = True
cnt = 0
for _ in range(m):
word = read().strip()
if word_len[len(word)] and word_trie.search(word):
cnt += 1
print(cnt)
class ListNode:
def __init__(self,val):
self.val = val
self.next = None
def __init__(self, val):
self.val = val
self.next = None
def printNodes(node:ListNode):
crnt_node = node
while crnt_node is not None:
print(crnt_node.val, end=' ')
crnt_node = crnt_node.next
class SLinkedList:
def __init__(self):
self.head = None
def addAtHead(self, val): #O(1)
node = ListNode(val)
node.next = self.head
self.head = node
#but when the list
def addBack(self, val): #O(n)
node = ListNode(val)
crnt_node = self.head
while crnt_node.next:
crnt_node = crnt_node.next
crnt_node.next = node
def findNode(self, val): #O(n)
crnt_node = self.head
while crnt_node is not None:
if crnt_node.val == val:
return crnt_node
crnt_node = crnt_node.next
raise RuntimeError('Node not found')
def addAfter(self, node, val): #O(1)
new_node = ListNode(val)
new_node.next = node.next
node.next = new_node
def deleteAfter(self, prev_node): #O(1)
if prev_node.next is not None:
prev_node.next = prev_node.next.next