49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
# 문자열 게임 2
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def find_str(w, k):
|
|
result = {chr(i): [] for i in range(97, 123)}
|
|
ans1 = float("inf")
|
|
ans2 = -1
|
|
for i, c in enumerate(w):
|
|
result[c].append(i)
|
|
|
|
for lst in result.values():
|
|
for i in range(len(lst)-k+1):
|
|
ans1 = min(ans1, lst[i+k-1] - lst[i]+1)
|
|
ans2 = max(ans2, lst[i+k-1] - lst[i]+1)
|
|
|
|
return (ans1, ans2)
|
|
|
|
def solution():
|
|
t = int(input().rstrip())
|
|
for _ in range(t):
|
|
w = input().rstrip()
|
|
k = int(input().rstrip())
|
|
|
|
answer1, answer2 = find_str(w, k)
|
|
if answer2 == -1:
|
|
print(answer2)
|
|
else:
|
|
print(answer1, answer2)
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 1시간 좀 넘게
|
|
|
|
시간 복잡도: 각 문자마다 슬라이딩 윈도우로 한번씩만 보기 때문에 O(n)이다.
|
|
|
|
해설: 전체 문자열을 한 번만 돌면서 문자마다 시작, 끝 인덱스와 개수 등을 저장하면서 진행하려고 했는데 한번에 하기에는
|
|
변하는 것이 너무 많아서 문자마다 인덱스를 저장하고 답을 구하기로 했다.
|
|
이렇게 해도 각 문자마다 한번씩만 보기 때문에 O(n)으로 괜찮다.
|
|
모든 알파벳에 대해 나오는 인덱스를 리스트에 순서대로 넣은 후 슬라이딩 윈도우로 K만큼에 있는 인덱스들의 차 + 1을 구한다.
|
|
이것이 문자열의 길이인데 3번은 최소값, 4번은 최대값을 구하면 된다.
|
|
"""
|