본문 바로가기

PS

[ 백준 / C++ ] 2531 : 회전 초밥

[ 문제 ]

 

2531번: 회전 초밥

 

[ 접근방법 ]

 

슬라이딩 윈도우를 통해 O(n) 만에 문제를 해결할 수 있다.

 

(i + k) % n 연산을 통해 인덱스가 n을 넘어 0으로 돌아가는 경우를 쉽게 처리할 수 있다.

 

[ 소스코드 ]

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

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

    int n, d, k, c;
    cin >> n >> d >> k >> c;

    vector<int> vec(n);
    for(int i = 0; i < n; i++)cin >> vec[i];

    vector<int> chk(d + 1, 0);

    int ans = 0, cnt = 0;

    for(int i = 0; i < k; i++){
        if(!chk[vec[i]])cnt++;
        chk[vec[i]]++;
    }
    ans = cnt + (chk[c] ? 0 : 1);

    for(int i = 0; i < n; i++){
        chk[vec[i]]--;
        if(!chk[vec[i]])cnt--;
        if(!chk[vec[(i + k) % n]])cnt++;
        chk[vec[(i + k) % n]]++;

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

    cout << ans;

    return 0;
}

'PS' 카테고리의 다른 글

[ 백준 / C++ ] 2331 : 반복수열  (0) 2024.12.19
[ 백준 / C++ ] 11060 : 점프 점프  (0) 2024.12.18
[ 백준 / C++ ] 12891 : DNA 비밀번호  (0) 2024.12.16
[ 백준 / C++ ] 2776 : 암기왕  (0) 2024.12.12
[ 백준 / C++ ] 11501 : 주식  (1) 2024.12.11