본문 바로가기
코딩테스트 파이썬/백준

단어 만들기 ( 1148 번 )

by 세용용용용 2025. 9. 6.

1148번: 단어 만들기

 


🧠 알고리즘

  • 문자 퍼즐 완성 가능 여부를 Counter(해시맵) 으로 체크하고, 각 퍼즐이 만들 수 있는 단어들에 대해 최소/최대 빈도 문자를 탐색하는 방식

 

✔️ 동작 방식

  • 각 퍼즐에 대해 후보 단어들이 퍼즐로 만들 수 있는지 _ava_check 로 확인
  • 퍼즐의 알파벳 하나하나가 후보 단어 집합들에 몇 개 포함되는지 세어 빈도를 기록
  • 가장 적게 등장하는 알파벳들과, 가장 많이 등장하는 알파벳들을 정렬해 출력
  • 최종적으로 퍼즐별 "최소빈도문자 min개수 최대빈도문자 max개수" 형태로 출력

 

🧾 코드

import sys
from collections import Counter

def _mk():
    a1, a2 = [], []
    type = 1
    while True:
        now_str = sys.stdin.readline().rstrip()
        if now_str == '-':
            type = 2
            continue
        if now_str == '#':
            break

        if type == 1:
            a1.append(Counter(now_str))
        else:
            a2.append(Counter(now_str))

    return a1, a2


def _ava_check(pz, ct): # 못 만들면 False,,,
    for k, v in ct.items():
        if (k not in pz) or (pz[k] < v):
            return False
    return True


def _result(pz, ct): # 만들수 있는 min, max 단어 return
    answer = {}
    for i in pz:
        count = sum(1 for j in ct if i in j)
        if count in answer:
            answer[count].append(i)
        else:
            answer[count] = [i]

    n, m = min(answer.keys()), max(answer.keys())
    return f"{''.join(sorted(answer[n]))} {n} {''.join(sorted(answer[m]))} {m}"
    

def _main(create, pz):
    answer = []
    for now_pz in pz:
        ava_list = []
        for now_ct in create:
            if _ava_check(now_pz, now_ct):
                ava_list.append(set(now_ct.keys()))

        result = _result(set(now_pz.keys()), ava_list)
        answer.append(result)

    return '\n'.join(answer)

create, pz = _mk()
print(_main(create, pz))

 

⏱️ 시간 복잡도

for now_pz in pz : 퍼즐을 순회 ( 선형 시간 복잡도 )
	for now_ct in create : 주어진 단어를 순회 ( 선형 시간 복잡도 )
		_ava_check(now_pz, now_ct) : 각 단어 가능 여부 체크 ( 선형 시간 복잡도 )

해당 알고리즘 시간 복잡도 : 삼차형 시간 복잡도 ( O(n ** 3) )

'코딩테스트 파이썬 > 백준' 카테고리의 다른 글

피리 부는 사나이 ( 16724 번 )  (0) 2025.09.07
벽 부수고 이동하기 4 ( 16946 번 )  (0) 2025.09.06
배 ( 1092 번 )  (0) 2025.09.02
트리 ( 1068 번 )  (0) 2025.09.02
물병 ( 1052 번 )  (0) 2025.09.02