Files
baekjoon-study/workbook_8708/silver/2607-s2.py
2026-02-23 11:14:50 +09:00

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일때만
비슷한 단어로 판정했다.
"""