๐Ÿ’  Cpp/[Solved.ac] Class2~4

[BOJ][C++] ๋ฐฑ์ค€ 30804๋ฒˆ: ๊ณผ์ผ ํƒ•ํ›„๋ฃจ (Silver II)

์„ ๋‹ฌ 2024. 11. 12. 07:00
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

์€ํ•˜๋Š” ๊ธด ๋ง‰๋Œ€์— $N$๊ฐœ์˜ ๊ณผ์ผ์ด ๊ฝ‚ํ˜€์žˆ๋Š” ๊ณผ์ผ ํƒ•ํ›„๋ฃจ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณผ์ผ์˜ ๊ฐ ์ข…๋ฅ˜์—๋Š” $1$๋ถ€ํ„ฐ $9$๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด์žˆ๊ณ , ์•ž์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ $S_1, S_2, \cdots, S_N$๋ฒˆ ๊ณผ์ผ์ด ๊ฝ‚ํ˜€์žˆ์Šต๋‹ˆ๋‹ค. ๊ณผ์ผ ํƒ•ํ›„๋ฃจ๋ฅผ ๋‹ค ๋งŒ๋“  ์€ํ•˜๊ฐ€ ์ฃผ๋ฌธ์„ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด๋‹ˆ ๊ณผ์ผ์„ ๋‘ ์ข…๋ฅ˜ ์ดํ•˜๋กœ ์‚ฌ์šฉํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
ํƒ•ํ›„๋ฃจ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ์‹œ๊ฐ„์ด ์—†์—ˆ๋˜ ์€ํ•˜๋Š”, ๋ง‰๋Œ€์˜ ์•ž์ชฝ๊ณผ ๋’ค์ชฝ์—์„œ ๋ช‡ ๊ฐœ์˜ ๊ณผ์ผ์„ ๋นผ์„œ ๋‘ ์ข…๋ฅ˜ ์ดํ•˜์˜ ๊ณผ์ผ๋งŒ ๋‚จ๊ธฐ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์—์„œ $a$๊ฐœ, ๋’ค์—์„œ $b$๊ฐœ์˜ ๊ณผ์ผ์„ ๋นผ๋ฉด $S_{a+1}, S_{a+2}, \cdots, S_{N-b-1}, S_{N-b}$๋ฒˆ ๊ณผ์ผ, ์ด $N-(a+b)$๊ฐœ๊ฐ€ ๊ฝ‚ํ˜€์žˆ๋Š” ํƒ•ํ›„๋ฃจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. $(0 \le a, b;$ $a+b < N)$
์ด๋ ‡๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ณผ์ผ์„ ๋‘ ์ข…๋ฅ˜ ์ดํ•˜๋กœ ์‚ฌ์šฉํ•œ ํƒ•ํ›„๋ฃจ ์ค‘์—์„œ, ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ํƒ•ํ›„๋ฃจ์˜ ๊ณผ์ผ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜์„ธ์š”.

์ž…๋ ฅ

์ฒซ ์ค„์— ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜ $N$์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. $(1 \le N \le 200\,000)$
๋‘˜์งธ ์ค„์— ํƒ•ํ›„๋ฃจ์— ๊ฝ‚ํžŒ ๊ณผ์ผ์„ ์˜๋ฏธํ•˜๋Š” $N$๊ฐœ์˜ ์ •์ˆ˜ $S_1, \cdots, S_N$์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. $(1 \le S_i \le 9)$

์ถœ๋ ฅ

๋ฌธ์ œ์˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ณผ์ผ์„ ๋‘ ์ข…๋ฅ˜ ์ดํ•˜๋กœ ์‚ฌ์šฉํ•œ ํƒ•ํ›„๋ฃจ ์ค‘์—์„œ, ๊ณผ์ผ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ํƒ•ํ›„๋ฃจ์˜ ๊ณผ์ผ ๊ฐœ์ˆ˜๋ฅผ ์ฒซ์งธ ์ค„์— ์ถœ๋ ฅํ•˜์„ธ์š”.

 

ํ’€์ด

ํˆฌํฌ์ธํ„ฐ(์Šฌ๋ผ์ด๋“œ ์œˆ๋„์šฐ?)๋กœ ํ’€์–ด์•ผ ํšจ์œจ์„ฑ์ด ์ œ์ผ ์ข‹์€ ๋ฌธ์ œ

ํ˜„์žฌ ๊ณผ์ผ์˜ ์ข…๋ฅ˜๊ฐ€ 2 ์ดํ•˜๋ฉด ์˜ค๋ฅธ์ชฝ์„ ์˜ฎ๊ฒจ์„œ ๊ธธ์ด๋ฅผ ๋Š˜๋ฆฌ๊ณ 

2๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์™ผ์ชฝ์„ ์˜ฎ๊ฒจ์„œ ๊ธธ์ด๋ฅผ ์ค„์ธ๋‹ค

๋‚˜๋Š” ์œˆ๋„์šฐ์— ์†ํ•œ ๊ฐ ๊ณผ์ผ์˜ ๊ฐฏ์ˆ˜๋ฅผ cnt ๋ฐฐ์—ด์— ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค

(cnt[i] : i๋ฒˆ ๊ณผ์ผ์˜ ๊ฐฏ์ˆ˜) 

 

๊ณผ์ผ์˜ ์ข…๋ฅ˜๋Š” ์œˆ๋„์šฐ๋ฅผ ์ด๋™์‹œํ‚ฌ ๋•Œ ๋งˆ๋‹ค ๊ตฌํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ,

๋งค๋ฒˆ cnt๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์ข…๋ฅ˜๋ฅผ ์„ธ๋Š”๊ฑด ๋น„ํšจ์œจ์ ์ด๋‹ค

 

๋”ฐ๋ผ์„œ ์ธ๋ฑ์Šค๋ฅผ ์˜ฎ๊ฒจ์„œ cnt๊ฐ’์„ ๋ณ€ํ™”์‹œํ‚ฌ ๋•Œ,

๊ทธ ๊ฐ’์ด 0์œผ๋กœ ๋ณ€ํ•œ๋‹ค๋ฉด -> ๊ณผ์ผ ์ข…๋ฅ˜ ๊ฐ์†Œ,

0์—์„œ ๋ณ€ํ•œ๋‹ค๋ฉด -> ๊ณผ์ผ ์ข…๋ฅ˜ ์ฆ๊ฐ€

 

์•„๋ž˜ ์ฝ”๋“œ์—์„œ ๋””๋ฒ„๊น… ๋ถ€๋ถ„์˜ ์ฃผ์„์„ ํ’€์–ด์„œ ์˜ˆ์ œ1์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด

5
5 1 1 2 1
---
5 1
51 2
511 2
5112 3
112 2
1121 2
4

 

์ž˜ ๋œจ๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int main() {
    // input
    int n;
    cin >> n;
    vector<int>v(n);
    for(int i=0; i<n; i++) {
        cin >> v[i];
    }
    
    // solve
    vector<int>cnt(10,0); // cnt[i] : i๋ฒˆ ๊ณผ์ผ ๊ฐฏ์ˆ˜
    int left=0, right=0;
    cnt[v[left]]++;
    int fruit = 1; // ๊ณผ์ผ ์ข…๋ฅ˜ ๊ฐฏ์ˆ˜
    
    int ans = 0; // ์ตœ๋Œ€ ๊ณผ์ผ ๊ฐฏ์ˆ˜
    
    while(right<n) {
        // debug
        // for(int i=left; i<right+1; i++) {
        //     cout << v[i];
        // } cout << " " << fruit << "\n";
        
        if(fruit>2) {
            // ์™ผ์ชฝ ํฌ์ธํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
            cnt[v[left]]--;
            if(cnt[v[left]]==0) {
                fruit--;
            }
            left++;
        } else {
            ans = max(ans, right-left+1); // ์ตœ๋Œ€๊ธธ์ด ๊ฐฑ์‹ 
            
            // ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
            right++;
            if(cnt[v[right]]==0) {
                fruit++;
            }
            cnt[v[right]]++;
        }
    }
    
    // output
    cout << ans;
    
    return 0;
}
๋ฐ˜์‘ํ˜•