Coding Test/BaekJoon_Python

백준 2607 <비슷한 단어> Python

JunOnJuly 2024. 1. 27. 17:32
728x90

https://www.acmicpc.net/problem/2607

 

2607번: 비슷한 단어

첫째 줄에는 단어의 개수가 주어지고 둘째 줄부터는 한 줄에 하나씩 단어가 주어진다. 모든 단어는 영문 알파벳 대문자로 이루어져 있다. 단어의 개수는 100개 이하이며, 각 단어의 길이는 10 이

www.acmicpc.net


Counter 와 defaultdict 를 사용해 간단하게 풀 수 있는 문제였습니다.


from collections import defaultdict, Counter


def solution(data_list):
    # 딕셔너리 리스트
    dict_list = [defaultdict(int, Counter(data)) for data in data_list]
    # 기준 딕셔너리
    main_dict = dict_list[0]
    # 비슷한 단어 카운트
    sim_count = 0
    # 딕셔서너리 리스트 순회
    for sub_dict in dict_list[1:]:
        # 글자 수가 2 이상 차이나면 패스
        if abs(sum([value for value in main_dict.values()]) - sum([value for value in sub_dict.values()])) >= 2:
            continue
        # 차이 리스트
        diff_list = [0 for _ in range(26)]
        # 각 알파벳에 대해 차이 구하기
        for asc in range(ord("A"), ord("Z")+1):
            # 차이 리스트 채우기
            diff_list[asc-ord("A")] = abs(main_dict[chr(asc)]-sub_dict[chr(asc)])
        # 문자 수가 모든 차이의 합이 2 이하이고 모든 차이가 1 이하면 비슷한 단어
        if sum(diff_list) <= 2 and all([num<=1 for num in diff_list]):
            sim_count += 1
    print(sim_count)


data_list = [input() for _ in range(int(input()))]
solution(data_list)

 

728x90