63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
# 비슷한 단어
|
|
|
|
import sys
|
|
from collections import Counter
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def check_similar(now_word, target_c):
|
|
target_c_copy = target_c.copy()
|
|
now_word_left = []
|
|
for c in now_word:
|
|
if len(target_c_copy) < 1:
|
|
break
|
|
|
|
if target_c_copy.get(c, -1) == -1:
|
|
now_word_left.append(c)
|
|
continue
|
|
|
|
target_c_copy[c] -= 1
|
|
if target_c_copy[c] == 0:
|
|
del target_c_copy[c]
|
|
|
|
len_target_left = sum(target_c_copy.values())
|
|
result = 1 if len_target_left <= 1 and len(now_word_left) <= 1 else 0
|
|
|
|
return result
|
|
|
|
|
|
def solution():
|
|
n = int(input().rstrip())
|
|
|
|
result = 0
|
|
target = input().rstrip()
|
|
target_c = Counter(target)
|
|
|
|
for _ in range(n-1):
|
|
now_word = input().rstrip()
|
|
if len(now_word) >= len(target)+2:
|
|
continue
|
|
|
|
result += check_similar(now_word, target_c)
|
|
|
|
print(result)
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 32분
|
|
|
|
시간 복잡도: 단어 길이를 m이라고 하자. 중복 제거할 때는 둘 중 짧은 단어만큼 진행된다. -> O(m)
|
|
target_c의 values 합 구하기 -> O(m)
|
|
이 두 과정이 check_similar()이고, O(m)이다. 이제 이 과정을 n-1개의 단어만큼 진행하기 때문에 전체 시간복잡도는 O(nm)이다.
|
|
|
|
해설: 비슷한 단어의 조건을 수치적으로 정리하면 target과 비교하는 단어의 길이 차이가 2이상 나면 안되고,
|
|
겹치는 글자들을 개수 기준으로 다 제거했을 때 양쪽 다 남은 글자가 1을 초과하면 안된다.
|
|
따라서 나는 target을 Counter로 만들고, 비교하는 단어를 쭉 보면서 target_c에 있으면 개수를 줄이는 방식으로 중복을 제거했다.
|
|
이때 target_c에 없으면 남는 글자는 따로 리스트에 보관하였다.
|
|
마지막으로 target_c의 values 합이 남는 글자 수고, len(lst)가 비교하는 글자의 남는 글자 수이므로 이것의 길이가 둘 다 <= 1일때만
|
|
비슷한 단어로 판정했다.
|
|
""" |