하루살이 개발자

[BaekJoon 20437번] 문자열 게임2(Python) 본문

코딩테스트

[BaekJoon 20437번] 문자열 게임2(Python)

하루살이 2022. 2. 24. 14:49

문자열 게임2 문제입니다.

 

문제링크:https://www.acmicpc.net/problem/20437

 

20437번: 문자열 게임 2

첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다. 두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.

www.acmicpc.net

 

풀이

defaultdict을 이용하자!
alpha = defaultdict(list)으로 괄호 안에 값의 초기값 형태를 지정해주면 된다.

 

Code

import sys
from collections import defaultdict

t = int(sys.stdin.readline())

# testCase만큼 반복
for test_num in range(t):
    # 문자, k 입력받기
    string = input()
    K = int(input())

    len_str = len(string)

    # K개 이상 있는 문자만 따로 저장
    alpha = defaultdict(list)

    # alpha = {'u': [1, 7], 'r': [4, 11], 'a': [5, 8, 13], 'o': [10, 15]}
    # u는 인덱스 1, 7인 자리에 존재한다는 의미
    for i in range(len_str):
        if string.count(string[i]) >= K:
            alpha[string[i]].append(i)


    # K개 이상 있는 문자가 없다면 -1
    if not alpha:
        print(-1)
    else:
        min_str = 0
        max_str = 0

        for idx_lst in alpha.values():
            print("idx_lst:", idx_lst)
            # super에서 K=3인 경우는 sup, upe, per 이므로
            # index = 0에서부터 문자의 총 길이에서 k를 빼준 index까지 진행
            for j in range(len(idx_lst) - K + 1):
                # 'u': [1, 7]에서 7 - 1 + 1 = 7(u를 k개 포함한 길이)
                temp = idx_lst[j + K - 1] - idx_lst[j] + 1

                # 문자열 길이 최소값
                if temp < min_str:
                    min_str = temp

                # 문자열 길이 최대값(최댓값으로 갱신)
                if temp > max_str:
                    max_str = temp

        print(min_str, max_str)