반응형
📚 문자열 게임 2
문제
작년에 이어 새로운 문자열 게임이 있다. 게임의 진행 방식은 아래와 같다.
- 알파벳 소문자로 이루어진 문자열 W가 주어진다.
- 양의 정수 K가 주어진다.
- 어떤 문자를 정확히 K개를 포함하는 가장 짧은 연속 문자열의 길이를 구한다.
- 어떤 문자를 정확히 K개를 포함하고, 문자열의 첫 번째와 마지막 글자가 해당 문자로 같은 가장 긴 연속 문자열의 길이를 구한다.
위와 같은 방식으로 게임을 T회 진행한다.
입력
문자열 게임의 수 T가 주어진다. (1 ≤ T ≤ 100)
다음 줄부터 2개의 줄 동안 문자열 W와 정수 K가 주어진다. (1 ≤ K ≤ |W| ≤ 10,000)
출력
T개의 줄 동안 문자열 게임의 3번과 4번에서 구한 연속 문자열의 길이를 공백을 사이에 두고 출력한다.
만약 만족하는 연속 문자열이 없을 시 -1을 출력한다.
예제 입력 1 복사
2
superaquatornado
2
abcdefghijklmnopqrstuvwxyz
5
예제 출력 1 복사
4 8
-1
첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다.
두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.
예제 입력 2 복사
1
abaaaba
3
예제 출력 2 복사
3 4
✍ 접근
- 문제 : 양쪽이 포함되는 for문 잘 돌려? dict 잘 쓸줄 알아?
- 라고 물어보는 듯한 문제였다
- 처음에는 간단하게 생각하고 for문 안에 cnt,length를 넣고 그 안에 다시 for문을 돌리면서 길이를 계산하려고 했는데, 예제 2번을 생각하지 못한 코드여서 바로실패
정답코드
# ✨ 입력
import sys
input = sys.stdin.readline
T = int(input())
for _ in range(T):
word = input().rstrip()
K = int(input())
set_word = list(set(word))
dict = {}
g3 = 2147000000
g4 = -2147000000
# ✨ dict에 위치 배열로 저장하기
for i in range(len(set_word)):
if word.count(set_word[i])>=K:
dict[set_word[i]] = []
for j in range(len(word)):
if set_word[i] == word[j]:
dict[set_word[i]].append(j)
if dict == {}:
print(-1)
continue
# ✨ 가장 긴 길이 / 짧은 길이 계산하기
for w,pos in dict.items():
for i in range(len(pos)-K+1):
length = pos[i+K-1]-pos[i]+1
g3 = min(g3,length)
g4 = max(g4,length)
print(g3,g4)
해설
입력
- 문제에서 나온 값을 입력받는다
dict에 위치 배열로 저장하기
- 중복을 제거한 문자열을 상위 for문,
- 만약 문자가 원래 문자열 안에 K개 이상 존재한다면(필수조건을 충족한다면)
- dict에 배열을 만들어준다
- 원래 문자열을 하위 for문으로 돌린다
- 중복을 제거한 문자와 원래 문자열을 비교하면서
두 문자가 같으면 - dict에 만들어둔 배열에 append해준다
- 중복을 제거한 문자와 원래 문자열을 비교하면서
- 만약 dict가 비어있으면 (필수조건을 충족하지 못했으면)
더 볼 필요도 없이 -1을 출력하고 다음 Test로 넘어간다
가장 긴 길이 / 짧은 길이 계산하기
- dict에서 items를 꺼내와 (사실 value만 꺼내와도 된다 다시 보니 보이네 💦)
- 안에 for문을 len(pos) == value값 -K(최소 문자의 개수) + 1
- 문제에서 말하는 문자 2개 == 첫 문자와 마지막 문자가 포함되어 2개라는 말
- 따라서 첫 문자와 마지막 문자를 포함시켜주고
- length에도 1을 더해줘야 한다 (5-3 == 2로 만약 5와 3이 다 포함되었다면 5-3+1 == 3을 해줘야 하니까)
⭐ 배움
- 문자열.. 언제 손에 익을까?
반응형
'🏄♀️ 코딩테스트 > 🐍 Python' 카테고리의 다른 글
[ 백준 18353 해설 ] ( python ) 병사 배치하기 (0) | 2022.12.01 |
---|---|
[ 백준 3079 해설 ] ( python ) 입국심사 (0) | 2022.09.07 |
[ 백준 2533 해설 ] ( python ) 트리와 쿼리 (0) | 2022.09.06 |
[ 백준 9252 해설 ] ( python ) LCS 2 (0) | 2022.09.06 |
[ 백준 9251 해설 ] ( python ) LCS (0) | 2022.09.06 |