Koala - 17기/코딩테스트 심화 스터디
[백준/C++] 2531번: 회전 초밥
alswns8081
2025. 1. 24. 01:07
접근 방법
a 배열을 통해 초밥의 가짓수 d(2 ~ 3000)가 k개의 접시를 연속해서 먹을 때 있는지 확인
먼저 반복문을 돌려서 0 ~ k-1 접시를 연속으로 먹었을 때 최댓값을 계산(윈도우로 활용)
해당 윈도우를 접시를 지우고, 추가하며 연속된 접시를 k 개 먹었을 때, 최댓값을 계산(슬라이딩 윈도우)
코드
#include <iostream>
#include <vector>
using namespace std;
int a[3001] = {0, };
int main() {
int N, d, k, c;
cin >> N >> d >> k >> c;
vector<int> v(N);
for (int i = 0; i < N; i++) cin >> v[i];
int sol = 0, result = 0;
for (int i = 0; i < k; i++) {
if (a[v[i]] == 0) result++;
a[v[i]]++;
}
sol = result + (a[c] == 0 ? 1 : 0);
for (int i = 1; i < N; i++) {
int removeIdx = v[(i-1)%N];
a[removeIdx]--;
if (a[removeIdx] == 0) result--;
int addIdx = v[(i+k-1)%N];
if (a[addIdx] == 0) result++;
a[addIdx]++;
sol = max(sol, result + (a[c] == 0 ? 1 : 0));
}
cout << sol;
return 0;
}