๐Ÿ•๏ธ ICPC Sinchon/Two Pointer

[BOJ S1][C++] ๋ฐฑ์ค€ 2531๋ฒˆ: ํšŒ์ „ ์ดˆ๋ฐฅ

์„ ๋‹ฌ 2022. 10. 20. 03:22
๋ฐ˜์‘ํ˜•

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

 

2531๋ฒˆ: ํšŒ์ „ ์ดˆ๋ฐฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ํšŒ์ „ ์ดˆ๋ฐฅ ๋ฒจํŠธ์— ๋†“์ธ ์ ‘์‹œ์˜ ์ˆ˜ N, ์ดˆ๋ฐฅ์˜ ๊ฐ€์ง“์ˆ˜ d, ์—ฐ์†ํ•ด์„œ ๋จน๋Š” ์ ‘์‹œ์˜ ์ˆ˜ k, ์ฟ ํฐ ๋ฒˆํ˜ธ c๊ฐ€ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤

www.acmicpc.net

 

๋ฌธ์ œ

ํšŒ์ „ ์ดˆ๋ฐฅ ์Œ์‹์ ์—๋Š” ํšŒ์ „ํ•˜๋Š” ๋ฒจํŠธ ์œ„์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ดˆ๋ฐฅ์ด ์ ‘์‹œ์— ๋‹ด๊ฒจ ๋†“์—ฌ ์žˆ๊ณ , ์†๋‹˜์€ ์ด ์ค‘์—์„œ ์ž๊ธฐ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์ดˆ๋ฐฅ์„ ๊ณจ๋ผ์„œ ๋จน๋Š”๋‹ค. ์ดˆ๋ฐฅ์˜ ์ข…๋ฅ˜๋ฅผ ๋ฒˆํ˜ธ๋กœ ํ‘œํ˜„ํ•  ๋•Œ, ๋‹ค์Œ ๊ทธ๋ฆผ์€ ํšŒ์ „ ์ดˆ๋ฐฅ ์Œ์‹์ ์˜ ๋ฒจํŠธ ์ƒํƒœ์˜ ์˜ˆ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค. ๋ฒจํŠธ ์œ„์—๋Š” ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์ดˆ๋ฐฅ์ด ๋‘˜ ์ด์ƒ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. 

์ƒˆ๋กœ ๋ฌธ์„ ์—ฐ ํšŒ์ „ ์ดˆ๋ฐฅ ์Œ์‹์ ์ด ๋ถˆ๊ฒฝ๊ธฐ๋กœ ์˜์—…์ด ์–ด๋ ค์›Œ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ํ–‰์‚ฌ๋ฅผ ํ†ตํ•ด์„œ ๋งค์ƒ์„ ์˜ฌ๋ฆฌ๊ณ ์ž ํ•œ๋‹ค.

  1. ์›๋ž˜ ํšŒ์ „ ์ดˆ๋ฐฅ์€ ์†๋‹˜์ด ๋งˆ์Œ๋Œ€๋กœ ์ดˆ๋ฐฅ์„  ๊ณ ๋ฅด๊ณ , ๋จน์€ ์ดˆ๋ฐฅ๋งŒํผ ์‹๋Œ€๋ฅผ ๊ณ„์‚ฐํ•˜์ง€๋งŒ, ๋ฒจํŠธ์˜ ์ž„์˜์˜ ํ•œ ์œ„์น˜๋ถ€ํ„ฐ k๊ฐœ์˜ ์ ‘์‹œ๋ฅผ ์—ฐ์†ํ•ด์„œ ๋จน์„ ๊ฒฝ์šฐ ํ• ์ธ๋œ ์ •์•ก ๊ฐ€๊ฒฉ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. 
  2. ๊ฐ ๊ณ ๊ฐ์—๊ฒŒ ์ดˆ๋ฐฅ์˜ ์ข…๋ฅ˜ ํ•˜๋‚˜๊ฐ€ ์“ฐ์ธ ์ฟ ํฐ์„ ๋ฐœํ–‰ํ•˜๊ณ , 1๋ฒˆ ํ–‰์‚ฌ์— ์ฐธ๊ฐ€ํ•  ๊ฒฝ์šฐ ์ด ์ฟ ํฐ์— ์ ํ˜€์ง„ ์ข…๋ฅ˜์˜ ์ดˆ๋ฐฅ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€๋กœ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•œ๋‹ค. ๋งŒ์•ฝ ์ด ๋ฒˆํ˜ธ์— ์ ํ˜€์ง„ ์ดˆ๋ฐฅ์ด ํ˜„์žฌ ๋ฒจํŠธ ์œ„์— ์—†์„ ๊ฒฝ์šฐ, ์š”๋ฆฌ์‚ฌ๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์†๋‹˜์—๊ฒŒ ์ œ๊ณตํ•œ๋‹ค.  

์œ„ ํ• ์ธ ํ–‰์‚ฌ์— ์ฐธ์—ฌํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ํ•œ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ดˆ๋ฐฅ์„ ๋จน์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์œ„ ๊ทธ๋ฆผ์˜ ์˜ˆ๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. k=4์ด๊ณ , 30๋ฒˆ ์ดˆ๋ฐฅ์„ ์ฟ ํฐ์œผ๋กœ ๋ฐ›์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ฟ ํฐ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฉด 4๊ฐ€์ง€ ๋‹ค๋ฅธ ์ดˆ๋ฐฅ์„ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” (9, 7, 30, 2), (30, 2, 7, 9), (2, 7, 9, 25) ์„ธ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, 30๋ฒˆ ์ดˆ๋ฐฅ์„ ์ถ”๊ฐ€๋กœ ์ฟ ํฐ์œผ๋กœ ๋จน์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ (2, 7, 9, 25)๋ฅผ ๊ณ ๋ฅด๋ฉด 5๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์ดˆ๋ฐฅ์„ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. 

ํšŒ์ „ ์ดˆ๋ฐฅ ์Œ์‹์ ์˜ ๋ฒจํŠธ ์ƒํƒœ, ๋ฉ”๋‰ด์— ์žˆ๋Š” ์ดˆ๋ฐฅ์˜ ๊ฐ€์ง“์ˆ˜, ์—ฐ์†ํ•ด์„œ ๋จน๋Š” ์ ‘์‹œ์˜ ๊ฐœ์ˆ˜, ์ฟ ํฐ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์†๋‹˜์ด ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ดˆ๋ฐฅ ๊ฐ€์ง“์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. 

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ํšŒ์ „ ์ดˆ๋ฐฅ ๋ฒจํŠธ์— ๋†“์ธ ์ ‘์‹œ์˜ ์ˆ˜ N, ์ดˆ๋ฐฅ์˜ ๊ฐ€์ง“์ˆ˜ d, ์—ฐ์†ํ•ด์„œ ๋จน๋Š” ์ ‘์‹œ์˜ ์ˆ˜ k, ์ฟ ํฐ ๋ฒˆํ˜ธ c๊ฐ€ ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 2 ≤ N ≤ 30,000, 2 ≤ d ≤ 3,000, 2 ≤ k ≤ 3,000 (k ≤ N), 1 ≤ c ≤ d์ด๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ๋ฒจํŠธ์˜ ํ•œ ์œ„์น˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ํšŒ์ „ ๋ฐฉํ–ฅ์„ ๋”ฐ๋ผ๊ฐˆ ๋•Œ ์ดˆ๋ฐฅ์˜ ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 1 ์ด์ƒ d ์ดํ•˜์˜ ์ •์ˆ˜๊ฐ€ ๊ฐ ์ค„๋งˆ๋‹ค ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. 

์ถœ๋ ฅ

์ฃผ์–ด์ง„ ํšŒ์ „ ์ดˆ๋ฐฅ ๋ฒจํŠธ์—์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ดˆ๋ฐฅ์˜ ๊ฐ€์ง“์ˆ˜์˜ ์ตœ๋Œ“๊ฐ’์„ ํ•˜๋‚˜์˜ ์ •์ˆ˜๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

ํฌ๊ธฐ๊ฐ€ k์ธ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <deque>

using namespace std;

// ์ธ์ž๋กœ ๋ฐ›์€ eat ํ ๋‚ด์˜ ์ดˆ๋ฐฅ์˜ ์ข…๋ฅ˜์˜ ๊ฐฏ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด์„œ ๋ฆฌํ„ด
int countKind(deque<int> q, int k, int d, int c) {
    vector<bool> isEat(d+1, false);
    isEat[c] = true;
    
    for(int i=0; i<k; i++) {
        isEat[q.front()]=true;
        q.pop_front();
    }
    
    int kind = 0;
    for(int i=1; i<=d; i++) {
        if(isEat[i])
            kind++;
    }
    
    return kind;
}

// ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ดˆ๋ฐฅ์˜ ์ตœ๋Œ€ ๊ฐ€์ง“์ˆ˜
int maxKind(int n, int d, int k, int c, vector<int>&sushi) {
    deque<int> eat;
    for(int i=0; i<k; i++)
        eat.push_back(sushi[i]);
    
    int max_kind = countKind(eat, k, d, c);
        
    for(int i=k; i<n+k; i++) {
        int end = i>=n ? i-n : i;  // ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์— ์ถ”๊ฐ€ํ•  ์ธ๋ฑ์Šค (sushi ๋ฒกํ„ฐ๋ฅผ ํšŒ์ „ํ•ด์•ผํ•˜๋ฏ€๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ)

        eat.pop_front();
        eat.push_back(sushi[end]);

        max_kind = max(max_kind, countKind(eat, k, d, c));
    }
    
    return max_kind;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int n, d, k, c;
    cin >> n >> d >> k >> c;
    vector<int> sushi(n);
    for(int i=0; i<n; i++)
        cin >> sushi[i];

    cout << maxKind(n, d, k, c, sushi);
    
    return 0;
}

/*
 */
๋ฐ˜์‘ํ˜•