No Rules Rules

회전 초밥 (feat. 백준, 15961번) 본문

생활/코테

회전 초밥 (feat. 백준, 15961번)

개발하는 완두콩 2022. 10. 18. 13:27
728x90
반응형

회전 초밥
https://www.acmicpc.net/problem/15961

 

15961번: 회전 초밥

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

www.acmicpc.net

 

// woohyeon.kim
// kim519620.tistory.com
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int arr[3000000], N, D, K, C, check[3001];
int main(){
    ios::sync_with_stdio(false), cin.tie(NULL);
    cin >> N >> D >> K >> C;
    memset(check, 0, sizeof(check));
    for(register int n = 0; n < N; ++n)
        cin >> arr[n];
    register int s = 0, ans = 0, cnt = 0;
    for (register int i = 0; i < K; i++) {
        if(check[arr[i]] == 0)
            ++cnt;
        ++check[arr[i]];
	}
    while (s < N) {
        if(check[C] == 0)
            ans = max(ans, cnt + 1);
        else
            ans = max(ans, cnt);
        // S + K의 위치 검사
        if(++check[arr[(s + K) % N]] == 1)
            ++cnt;
        // S의 위치 검사
        if(--check[arr[s]] == 0)
            --cnt;
        ++s;
	}
    cout << ans;
    return 0;
}
// *&)*@*

 

반응형
  1. K개가 윈도우가 되어 S부터 한칸씩 옆으로 이동되는 모양이라고 생각해보면 쉽습니다.
  2. 처음 K개만큼 마킹을 해둔 뒤, 한칸씩 옆으로 이동된다면, S 위치는 빼주고 K+1의 위치는 더해주면서 마킹된 정보로 총 개수를 구하면 됩니다.
  3. 최초에는 자료구조 set을 이용하였으나 시간초과 판정을 받아 카운트마스킹 (비트마스킹처럼) 형태로 풀어보았습니다.
728x90
반응형
Comments