728x90
시간 제한 1초, 메모리 제한 1024MB
# 조건
- 작년에 이어 새로운 문자열 게임이 있다.
- 게임의 진행 방식은 아래와 같다.
- 알파벳 소문자로 이루어진 문자열 W가 주어진다.
- 양의 정수 K가 주어진다.
- 어떤 문자를 정확히 K개를 포함하는 가장 짧은 연속 문자열의 길이를 구한다.
- 어떤 문자를 정확히 K개를 포함하고, 문자열의 첫 번째와 마지막 글자가 해당 문자로 같은 가장 긴 연속 문자열의 길이를 구한다.
- 위와 같은 방식으로 게임을 T회 진행한다.
# 접근 방법
- 주어지는 문자열을 입력받는다.
- count라는 defaultdict를 사용하여 문자열을 탐색하며 주어지는 알파벳이 등장하는 인덱스 번호를 기록해준다.
- 이후 count 딕셔너리를 순회하며, 해당 value 값의 길이가 K보다 작다면 K개를 포함하라는 조건을 만족할 수 없으므로 continue
- K개 이상이라면, left 포인터는 0부터 시작하고, right 는 left + K -1로 시작해주며 정확하게 K개가 들어있도록 설정해준다.
- right와 left를 동시에 1씩 늘려주어야 정확히 K개를 포함할 수 있다.
- 이후 가장 짧은 길이와 가장 긴 길이를 갱신해주고
- 탐색이 끝난 후 가장 긴 길이가 초기 값 0이라면 -1을 출력해준다.
from collections import defaultdict
T = int(input())
for _ in range(T):
words = input()
K = int(input())
count = defaultdict(list)
short_res = 99999999
long_res = 0
for i, j in enumerate(words):
count[j].append(i)
for i in count:
val = count[i]
if len(val) < K:
continue
else:
left = 0
right = left + K - 1
while right < len(val):
leng = val[right] - val[left] + 1
if leng < short_res:
short_res = leng
if leng > long_res:
long_res = leng
right += 1
left += 1
if long_res == 0:
print(-1)
else:
print(short_res, long_res)
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[프로그래머스 Lv 3] 파이썬 - 인사고과 (0) | 2023.07.05 |
---|---|
[프로그래머스 Lv2] 파이썬 - 문자열 압축 (0) | 2023.07.05 |
[백준 12919번] 파이썬 - A와 B 2 (0) | 2023.06.27 |
[백준 1017번] 파이썬 - 소수 쌍 (1) | 2023.06.14 |
[백준 20055번] 파이썬 - 컨베이어 벨트 위의 로봇 (0) | 2023.06.12 |