알고리즘/BOJ
[백준] 20437_문자열 게임2
엉아_
2021. 8. 21. 16:33
728x90
📕 문제
작년에 이어 새로운 문자열 게임이 있다. 게임의 진행 방식은 아래와 같다.
- 알파벳 소문자로 이루어진 문자열 W가 주어진다.
- 양의 정수 K가 주어진다.
- 어떤 문자를 정확히 K개를 포함하는 가장 짧은 연속 문자열의 길이를 구한다.
- 어떤 문자를 정확히 K개를 포함하고, 문자열의 첫 번째와 마지막 글자가 해당 문자로 같은 가장 긴 연속 문자열의 길이를 구한다.
위와 같은 방식으로 게임을 T회 진행한다.
입력
문자열 게임의 수 T가 주어진다. (1 ≤ T ≤ 100)
다음 줄부터 2개의 줄 동안 문자열 W와 정수 K가 주어진다. (1 ≤ K ≤ |W| ≤ 10,000)
출력
T개의 줄 동안 문자열 게임의 3번과 4번에서 구한 연속 문자열의 길이를 공백을 사이에 두고 출력한다.
만약 만족하는 연속 문자열이 없을 시 -1을 출력한다.
import sys
from collections import defaultdict
input = sys.stdin.readline
def string_game(W, K):
if K == 1: # k가 1이면 문자열은 무조건 1
return [1, 1]
alphabet = defaultdict(int) # 각 알파벳의 숫자를 담을 딕셔너리
interval = []
for i in W:
alphabet[i] += 1
for key, value in alphabet.items():
if value >= K: # 알파벳 중 숫자가 k개 이상인 것만 보이위해
index_list = list(filter(lambda x: W[x] == key, range(len(W))))
for j in range(len(index_list)-K+1):
interval.append(index_list[j+K-1] - index_list[j])
if not interval: # 검색 실패
return [-1]
return [min(interval)+1, max(interval)+1]
T = int(input())
for _ in range(T):
W = input()
K = int(input())
print(*string_game(W, K))