Tag: sliding window
All the articles with the tag "sliding window".
BOJ2531SILVER 1
첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤ k ≤ 3,000 (k ≤ N), 1 ≤ c ≤ d이다.
출력
주어진 회전 초밥 벨트에서 먹을 수 있는 초밥의 최대 가짓수를 출력하시오.
슬라이딩 윈도우 기법을 사용하는 문제이다.
from collections import defaultdict
N, d, k, c = map(int, input().split())
sushi_list = [int(input()) for _ in range(N)]
counter = defaultdict(int)
kind = 0
for i in range(k):
if counter[sushi_list[i]] == 0:
kind += 1
counter[sushi_list[i]] += 1
# 쿠폰
max_kind = kind + (1 if counter[c] == 0 else 0)
for i in range(1, N):
remove = sushi_list[i - 1]
counter[remove] -= 1
if counter[remove] == 0: # 더 이상 없으면 종류 수 감소
kind -= 1
cur = sushi_list[(i + k - 1) % N]
if counter[cur] == 0:
kind += 1
counter[cur] += 1
# 쿠폰
total = kind + (1 if counter[c] == 0 else 0)
max_kind = max(max_kind, total) # 최대 종류 수 갱신
print(max_kind)회전 초밥
백준 2531번 '회전 초밥' (실버 1) 문제 풀이. bruteforcing, two pointer, sliding window 로 접근했다.