본문 바로가기
알고리즘/백준 문제

2531 - 회전 초밥

by HDobby 2023. 7. 22.

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

 

2531번: 회전 초밥

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

www.acmicpc.net

생각해보기

  • 계속해서 모든 초밥을 확인하는 경우 O(N * K)로 30,000 * 3,000 약 9천만이라 잘못하면 시간 초과가 나게 된다.
  • 어차피 회전 초밥은 한칸씩 움직이므로 맨 처음칸을 제거 해준뒤 다음칸을 확인하면 된다.

코드

#include<iostream>
#include<vector>

using namespace std;

int N,D,K,C;
int arr[30001];
int chk[30001];
int ans = 0;

void input(){
    cin>>N>>D>>K>>C;
    for(int i=0;i<N;++i)
        cin>>arr[i];
}

void solution(){
    int l=0;
    int cnt=0;

    for(int i=0;i<K;++i){
        int idx = l + i;
        int num = arr[idx];
        
        if(!chk[num]){
            ++cnt;
        }

        ++chk[num];
    }

    ans = chk[C] ? cnt : cnt+1;

    while(++l<N){
        int idx = l-1;
        --chk[arr[idx]];
        if(!chk[arr[idx]])
            --cnt;

        idx = (l+K-1)%N;
        ++chk[arr[idx]];
        if(chk[arr[idx]] == 1)
            ++cnt;

        ans = max(ans, chk[C] ? cnt : cnt + 1);
    }

    cout<<ans<<'\n';
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    solution();

    return 0;
}

728x90

'알고리즘 > 백준 문제' 카테고리의 다른 글

17615 - 볼 모으기  (0) 2023.07.23
24337 - 가희와 탑  (0) 2023.07.22
22866 - 탑 보기  (0) 2023.07.21
2075 - N번째 큰 수  (0) 2023.07.21
14658 - 하늘에서 별똥별이 빗발친다  (0) 2023.07.20

댓글