https://www.acmicpc.net/problem/2531
2531번: 회전 초밥
첫 번째 줄에는 회전 초밥 벨트에 놓인 접시의 수 N, 초밥의 가짓수 d, 연속해서 먹는 접시의 수 k, 쿠폰 번호 c가 각각 하나의 빈 칸을 사이에 두고 주어진다. 단, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤
www.acmicpc.net
[ 백준 2531번 회전초밥 / 백준 15961번 회전초밥 소스 코드 ]
#include <iostream>
int data[ 3000000 ] = { 0 };
int ch[ 6000 ] = { 0 };
int main()
{
int N, d, k, c;
int t1 = 0, ans = 0;
scanf("%d %d %d %d\n", &N, &d, &k, &c);
for(int i = 0; i < k; i++)
{
scanf("%d\n", &data[ i ]);
if(!ch[ data[ i ] ] && data[ i ] != c)
{
t1++;
}
ch[ data[ i ] ]++;
}
ans = t1;
for(int i = 0; i < N - k; i++)
{
scanf("%d\n", &data[ i + k ]);
ch[ data[ i ] ]--;
if(!ch[ data[ i ] ] && data[ i ] != c)
{
t1--;
}
if(!ch[ data[ i + k ] ] && data[ i + k ] != c)
{
t1++;
}
ch[ data[ i + k ] ]++;
if(t1 > ans)
{
ans = t1;
}
}
for(int i = N - k; i < N - 1; i++)
{
ch[ data[ i % N ] ]--;
if(!ch[ data[ i % N ] ] && data[ i % N ] != c)
{
t1--;
}
if(!ch[ data[ (i + k) % N ] ] && data[ (i + k) % N ] != c)
{
t1 ++;
}
ch[ data[ (i + k) % N ] ]++;
if(t1 > ans)
{
ans = t1;
}
}
printf("%d\n", ans + 1);
return 0;
}
'백준 문제풀이' 카테고리의 다른 글
백준 1260 - dfs와 bfs - 비재귀(스택 큐사용) (1) | 2022.10.11 |
---|---|
백준 1182번 부분수열의 합 소스 코드 - 비트마스크 (0) | 2022.01.06 |
백준 2805번 - 나무 자르기 (0) | 2021.12.17 |
백준 2622번 - 삼각형만들기 (0) | 2021.12.10 |
백준 13015번 - 별찍기 23 (0) | 2021.12.08 |