Po_tta_tt0
콩심콩 팥심팥 🌱
Po_tta_tt0
전체 방문자
오늘
어제
  • 분류 전체보기 (266)
    • 🐛 회고 (14)
    • 💭 생각 (2)
    • 🤸‍♀️ 내 프로젝트 (16)
      • FISH-NEWS (8)
      • MBTI 과몰입 테스트 (2)
      • twitter clonecoding with TS (4)
      • pilzagenda (2)
    • 👨‍👩‍👧‍👦 팀 프로젝트 (2)
      • 피우다 프로젝트 (0)
      • SEMO(세상의 모든 모임) (1)
      • 마음을 전하는 텃밭 (1)
      • Stackticon (0)
    • 👨‍💻 CS지식 (11)
    • ✍ 공부 (94)
      • JavaScript (21)
      • TypeScript (39)
      • Html (0)
      • CSS (2)
      • React (18)
      • NextJS (7)
      • Vue (1)
      • Python (1)
      • Django (0)
      • 개발환경 & 그 외 (2)
    • 🏄‍♀️ 코딩테스트 (99)
      • 🐍 Python (99)
    • 🐙 Git & GitHub (3)
    • 📑 오류기록 (8)
    • 📚 우리를 위한 기록 (9)
    • 수업 (3)
    • 강의 등 (2)
    • 👩‍🎓 SSAFY (0)
    • 👋 우테코 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 플로이드 워셜
  • dfs
  • react-router-dom
  • Next.js
  • 파이썬 다익스트라
  • DP
  • bfs
  • 파이썬
  • BFS + DP
  • React
  • 문자열
  • 백준 파이썬
  • js
  • 이분탐색
  • 시뮬레이션
  • 파이썬 감시 피하기
  • 백준 숨바꼭질
  • 구현
  • 백준
  • 자바스크립트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Po_tta_tt0

콩심콩 팥심팥 🌱

🏄‍♀️ 코딩테스트/🐍 Python

[ 백준 20437 해설 ] ( python ) 문자열 게임 2

2022. 9. 7. 10:06
반응형

 

📚 문자열 게임 2

 

 

문제

작년에 이어 새로운 문자열 게임이 있다. 게임의 진행 방식은 아래와 같다.

  1. 알파벳 소문자로 이루어진 문자열 W가 주어진다.
  2. 양의 정수 K가 주어진다.
  3. 어떤 문자를 정확히 K개를 포함하는 가장 짧은 연속 문자열의 길이를 구한다.
  4. 어떤 문자를 정확히 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
    '🏄‍♀️ 코딩테스트/🐍 Python' 카테고리의 다른 글
    • [ 백준 18353 해설 ] ( python ) 병사 배치하기
    • [ 백준 3079 해설 ] ( python ) 입국심사
    • [ 백준 2533 해설 ] ( python ) 트리와 쿼리
    • [ 백준 9252 해설 ] ( python ) LCS 2
    Po_tta_tt0
    Po_tta_tt0
    감자의 코딩하는 블로그 콩심은데 콩나고 팥심은데 팥난다

    티스토리툴바