문자열 게임 2(백준 20437번)
💡 **Check Point !
( 해당사항 ✓체크 )
막힘 없이 수월하게 풀린 문제인가?
1시간이내로 풀렸던 문제인가?
1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
시간을 써도 도무지 풀 수 없는 문제인가?
솔루션을 찾아봤는가?✓
난이도 체감
최상
상✓
중
하
이해도
완벽히 이해✓
다소 헷갈리는 부분들이 있음
이해 못함
문제
작년에 이어 새로운 문자열 게임이 있다. 게임의 진행 방식은 아래와 같다.
- 알파벳 소문자로 이루어진 문자열 W가 주어진다.
- 양의 정수 K가 주어진다.
- 어떤 문자를 정확히 K개를 포함하는 가장 짧은 연속 문자열의 길이를 구한다.
- 어떤 문자를 정확히 K개를 포함하고, 문자열의 첫 번째와 마지막 글자가 해당 문자로 같은 가장 긴 연속 문자열의 길이를 구한다.
위와 같은 방식으로 게임을 T회 진행한다.
나의 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
from collections import defaultdict
T=int(input())
for _ in range(T):
w_location=defaultdict(list)
W=sys.stdin.readline().strip()
K=int(sys.stdin.readline().strip())
for i,w in enumerate(W):
w_location[w].append(i)
max_length=0
min_length=10001
if w_location:
for w_l in w_location:
if len(w_location[w_l])<K:
continue
for i in range(len(w_location[w_l])-K+1):
length=w_location[w_l][i+K-1]-w_location[w_l][i]+1
if length>max_length:
max_length=length
if length<min_length:
min_length=length
if min_length==10001 or max_length==0:
print(-1)
else:
print(min_length,max_length)
- collections의 defaultdict()를 사용하여 문제를 풀었다.
- 각 문자 별로 존재하는 위치 정보를 dictionary에 저장하고, K개 이상이 존재하는 dictionary에 대해서만 길이를 구했다.
- 짧은 문자열이든, 긴 문자열이든 K개 존재하는 문자가 양 끝에 존재해야 가장 짧거나, 길 수 있다.
- 따라서
K
개 이상의 원소를 갖는w_location[w_l]
의 list에서w_location[w_l][i+K-1]-w_location[w_l][i]+1
를 했을 때,w_l
문자가K
개 포함된 문자열의 길이를 알 수 있다. 그 중에서 가장 긴 값을 max_length, 짧은 값을 min_length에 저장한다.
- “슬라이드 윈도우 알고리즘”으로 풀어야 한다는 다른 사람의 힌트를 보고 풀려고 시도했는데, 시간 초과가 발생할 것 같아서 풀지 않았다. 그래도 해당 알고리즘을 알아두면 좋을 것 같다. (따지고 보면 사용한 것과 같은지도 모르겠다)
This post is licensed under CC BY 4.0 by the author.