알고리즘/백준
[Python] 백준 2531 : 회전 초밥
juhi
2021. 3. 31. 16:47
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)
반응형