문자열 - 20437번: 문자열 게임 2

jisu_log·2025년 5월 29일

알고리즘 문제풀이

목록 보기
33/105


  • 3번: 어떤 문자를 k개 포함하는 가장 짧은 연속 문자열의 길이 구하기 (결국 시작과 끝이 어떤 문자여야 가장 짧아짐)
  • 4번: 어떤 문자를 k개 포함하면서 시작과 끝이 해당 문자인 가장 긴 연속 문자열의 길이 구하기
    -> 3번과 4번은 각각 따로

t = int(input())


def get_min_max_str(w_set_list, k, w):

    w_list = list(w)
    min_len = 99999
    max_len = 0

    for target in w_set_list:
        target_list = []

        for index, a in enumerate(w_list):
            if a == target:
                target_list.append(index)
        
        if len(target_list) < k:
            continue
        elif len(target_list) == k:
            # 가장 짧은 문자열
            if target_list[-1] - target_list[0] + 1 < min_len:
                min_len = target_list[-1] - target_list[0] + 1


            # 가장 긴 문자열
            if target_list[-1] - target_list[0] + 1 > max_len:
                max_len = target_list[-1] - target_list[0] + 1
        else: # len이 k보다 더 클 경우 최소 길이 조합을 찾아야 함
            mins = 99999

            start = 0
            end = k - 1
            maxs = 0

            while start < len(target_list) and end < len(target_list):
                if target_list[end] - target_list[start] + 1 < mins:
                    mins = target_list[end] - target_list[start] + 1

                if target_list[end] - target_list[start] + 1 > maxs:
                    maxs = target_list[end] - target_list[start] + 1
                start += 1
                end += 1

            if mins < min_len:
                min_len = mins

            if maxs > max_len:
                max_len = maxs
    
    one = min_len
    two = max_len
    if one == 99999:
        one = -1
    if two == 0:
        two = -1
    if one == -1 and two == -1:
        print(-1)
        return
    print(one, two)
    return



for _ in range(t):
    w = input()
    k = int(input())

    
    w_list = list(w)
    w_set = set(w_list)
    w_set_list = list(w_set)

    get_min_max_str(w_set_list, k, w)
    

0개의 댓글