https://www.acmicpc.net/problem/2531

 

2531번: 회전 초밥

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

www.acmicpc.net


문제 해결을 위한 과정

이 문제의 경우 N의 범위가 30,000 이므로 투 포인터를 이용해서 풀어야 합니다. 초기 조건을 설정해 주고 해당하는 count배열에서 확인하면서 숫자가 있는지 없는지 확인하며 temp의 수를 구한 뒤 max(ans, temp)를 이용해서 풀어줍니다. 또한 회전 초밥 이므로 입력받은 배열을 2배로 늘려서 손쉽게 회전 초밥을 구현할 수 있습니다.


소스코드
n, d, k, c = map(int, input().split())
arr = []
ans = 0
count = [0] * 3001

for _ in range(n):
  arr.append(int(input()))

for i in range(n):
  arr.append(arr[i])

# 초기조건
for i in range(k):
  count[arr[i]] += 1
count[c] += 1
for i in range(3001):
  if count[i] != 0:
    ans += 1
count[c] -= 1

for i in range(k, n+k):
  count[arr[i-k]] -= 1
  count[arr[i]] += 1
  count[c] += 1
  temp = 0
  for j in range(3001):
    if count[j] != 0:
      temp += 1
  ans = max(ans, temp)
  count[c] -= 1
  
print(ans)

+ Recent posts