풀이
범위를 나타내는 left와 right를 두고 inch worm으로 계산해나가면 된다.
근데 그냥 반복문으로도 풀 수 있다.
코드
#include <stdio.h>
#include <algorithm>
using namespace std;
int N, D, K, C;
int sushi[30000 + 3000 + 3];
int cur_cnt[3000 + 3], cur_ans;
void push(int sushi_num) {
if (!cur_cnt[sushi_num]) ++cur_ans;
++cur_cnt[sushi_num];
}
void pop(int sushi_num) {
--cur_cnt[sushi_num];
if (!cur_cnt[sushi_num]) --cur_ans;
}
int main() {
scanf("%d %d %d %d", &N, &D, &K, &C);
for (int i = 0; i < N; ++i)
scanf("%d", &sushi[i]);
for (int i = 0; i < K - 1; ++i)
sushi[i + N] = sushi[i];
push(C);
for (int i = 0; i < K - 1; ++i)
push(sushi[i]);
int ans = 0;
for (int i = 0; i < N; ++i) {
push(sushi[i + K - 1]);
ans = max(ans, cur_ans);
pop(sushi[i]);
}
printf("%d", ans);
return 0;
}
아무말
백준, 백준 온라인 저지, BOJ, Baekjoon Online Judge, C, C++, 씨, 씨쁠쁠, JAVA, algorithm, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이