프론트엔드 개발자 중규리 입니다 ദി ᷇ᵕ ᷆ ) 자세히보기

PS/문제풀이

백준 15961 회전 초밥 Python

중규리 2024. 2. 6. 14:42

🐸 문제 정보

 

15961번: 회전 초밥

첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 3,000,000, 2 ≤ d ≤ 3,000, 2

www.acmicpc.net

 

🤖 알고리즘

슬라이딩 윈도우

 

⏱️ 풀이 시간

47.30m

 

📝 풀이

슬라이딩 윈도우의 정석 같은 문제였다.

풀이 자체가 복잡하지 않은데도, 처음에 k개까지 초기 설정하는 부분에서 헛디뎌서 검색까지했다.

  1. 0부터 k-1번 접시까지 개수를 딕셔너리에 초기화한다.
    • 이 때, 쿠폰 접시의 경우 기본적으로 1개를 추가해준다
  2. 이후 반복문을 돌면서 start가 n에 닿기 전까지 k개를 슬라이딩 윈도우하며 비교한다.
    • 이 때, 만약 start 부분의 접시를 뺐는데 0개가 된다면 딕셔너리의 key를 pop해서 개수에 포함되지 않도록 한다.

 

🧑‍💻 나의 답

# pypy3

import sys
from collections import defaultdict
input = sys.stdin.readline

n, d, k, c = list(map(int, input().rstrip().split()))
dishes = [int(input().rstrip()) for _ in range(n)]

start, end = 0, k
res = 0
dtype = defaultdict(int)
for i in range(0, k):
    dtype[dishes[i]] += 1
dtype[c] += 1

while start != n:
    res = max(res, len(dtype))
    dtype[dishes[start]] -= 1
    dtype[dishes[end % n]] += 1
    if dtype[dishes[start]] == 0:
        dtype.pop(dishes[start])
    start += 1
    end += 1

print(res)

'PS > 문제풀이' 카테고리의 다른 글

백준 16960 스위치와 램프 Python  (0) 2024.02.07
백준 9935 문자열 폭발 Python  (1) 2024.02.06
백준 1074 Z Python  (1) 2024.02.06
백준 5883 아이폰 9S Python  (0) 2024.02.06
백준 4485 녹색 옷 입은 애가 젤다지? Python  (0) 2024.02.05