풀이 방법
- 문제 이해 : 초밥을 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)
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Python] 백준 16234 : 인구 이동 (0) | 2021.04.06 |
---|---|
[Python] 백준 15684 : 사다리 조작 (0) | 2021.03.31 |
[Python] 백준 17609 : 회문 (0) | 2021.03.31 |
[Python] 백준 1700 멀티탭 스케줄링 (0) | 2021.03.31 |
[Python] 백준 3955 캔디 분배 (확장 유클리드 알고리즘) (0) | 2021.03.29 |