2531 : 회전 초밥

풀이

범위를 나타내는 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, 자바, 알고리즘, 자료구조, 문제, 문제 풀이, 풀이

wookje.kwon's profile image

wookje.kwon

2017-03-06 15:07

Read more posts by this author