본문 바로가기

알고리즘/백준

[Python] 백준 2531 : 회전 초밥

www.acmicpc.net/problem/2531

 

2531번: 회전 초밥

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

www.acmicpc.net

풀이 방법

  • 문제 이해 : 초밥을 k개 연속으로 먹었을 때 먹을 수 있는 최대 종류를 구하는 것이다.
  • left부터 right까지 먹을 때, 먹을 수 있는 초밥의 종류를 canEat이라는 딕셔너리에 저장한다.
  • 먹을 수 있는 초밥의 종류의 개수는 cnt에 저장한다. 
  • '회전' 초밥이기 때문에 0~k까지 뿐만아니라 n-1~k-1까지 순환할 수 있음을 잊으면 안된다. -> right = (left+k) % N으로 구현

전체 코드

from collections import defaultdict
N, d, k, c = map(int, input().split())
arr = []
for i in range(N):
    arr.append(int(input()))

canEat = defaultdict(int)
cnt = 1
canEat[c] = 1
for i in range(k):
    if canEat[arr[i]] == 0:
        cnt += 1
    canEat[arr[i]] += 1
answer = cnt
for left in range(N):
    right = (left+k)%N
    canEat[arr[left]] -= 1
    if canEat[arr[left]] == 0:
        cnt -= 1
    if canEat[arr[right]] == 0:
        cnt += 1
    canEat[arr[right]] += 1
    answer = max(answer, cnt)
print(answer)
반응형