2179-g3 성공
This commit is contained in:
59
workbook_8708/gold/2179-g3.py
Normal file
59
workbook_8708/gold/2179-g3.py
Normal file
@@ -0,0 +1,59 @@
|
||||
# 비슷한 단어
|
||||
|
||||
import sys
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
def solution():
|
||||
n = int(input().rstrip())
|
||||
|
||||
now = {"": [(input().rstrip(), i) for i in range(n)]}
|
||||
temp = {}
|
||||
idx = 0
|
||||
while 1:
|
||||
if not now:
|
||||
lst = list(temp.values())
|
||||
print(lst[0][0][0])
|
||||
print(lst[0][1][0])
|
||||
break
|
||||
|
||||
temp = now.copy()
|
||||
now = {}
|
||||
for key in temp:
|
||||
for word, num in temp[key]:
|
||||
if idx >= len(word):
|
||||
continue
|
||||
chr = key+word[idx]
|
||||
if now.get(chr, 0):
|
||||
now[chr].append((word, num))
|
||||
else:
|
||||
now[chr] = [(word, num)]
|
||||
|
||||
for key in list(now.keys()):
|
||||
if len(now[key]) == 1:
|
||||
del now[key]
|
||||
idx += 1
|
||||
|
||||
return
|
||||
|
||||
|
||||
solution()
|
||||
|
||||
"""
|
||||
걸린 시간: 오래 걸림
|
||||
|
||||
시간 복잡도: 모든 글자의 글자수를 보기 때문에 최대 글자수를 m이라고 하면 O(nm)이다. 근데 새로운 키를 만들 때 더하기를 하기 때문애 (O(nm*m))이다.
|
||||
|
||||
해설: 모든 단어들을 한글자씩 보면서 딕셔너리에 그 값을 키로 넣는다. 같은 글씨는 같은 키에 리스트로 모은다.
|
||||
두번째 이상의 글자를 볼때는 이전에 있던 키에 현재 글자를 더한 것을 키로 만들어서 반복한다.
|
||||
글자수가 다 다르기 때문에 현재 봐야하는 idx보다 글자 길이가 작으면 그냥 그 글자는 넘어간다.
|
||||
그 후 각 키에 대해 모인 것들의 개수가 1이면 겹치는 녀석이 없는 것이기 때문에 키를 del 한다.
|
||||
이때 del을 한 후 남은 것이 아무것도 없다면 그 녀석들이 최종 상태였으므로 그 녀석들을 가지고 와서 답을 낸다.
|
||||
그 녀석들은 temp에 분해하기 전에 기록해놓는다.
|
||||
계속 입력된 순서대로 꺼내서 진행했기 때문에 temp에 남은 첫 번째 리스트의 1,2번들이 답이다.
|
||||
|
||||
다른 방법으로 사전순으로 정렬하면 어느정도 prefix가 비슷한 애들끼리 모이기 때문에 인접한 것들끼리만 비교해서 최대 길이를 찾고,
|
||||
그 길이만큼 prefix인 녀석들을 모아서 입력 순서가 가장 빠른 녀석 두 놈을 골라서 주면 된다.
|
||||
정렬할 때 O(nlogn)에 글자수만큼 읽어야 되니까, 결국 정렬이 O(mnlogn)만큼 걸리고, 나머지 인접한 것 비교와 답 찾기는 O(nm)이면 된다.
|
||||
따라서 전체는 O(mnlogn)
|
||||
"""
|
||||
Reference in New Issue
Block a user