[c++] BOJ 15961๋ฒˆ :: ํšŒ์ „์ดˆ๋ฐฅ

 

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

๋‚ด ์ฝ”๋“œ

<์ฒซ๋ฒˆ์งธ ์‹œ๋„>

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

using namespace std;

int sushi_belt[3000000];
vector<set<int>> sushi_set;

int main() {
    int n, d, k, c;
    cin >> n >> d >> k >> c;
    for (int i = 0; i < n; i++)
        cin >> sushi_belt[i];

    /* ์ดˆ๋ฐฅ k๊ฐœ์”ฉ ๋Š์–ด ์ฝ๊ธฐ */
    int index = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < k; j++) {
            sushi_set.push_back(set<int>());
            int tmp = (i + j > n - 1) ? i + j - n : i + j; // ์›ํ˜• ๊ณ ๋ ค
            sushi_set[index].insert(sushi_belt[tmp]);
        }
        sushi_set[index++].insert(c);
    }

    /* ๊ฐ€์ง“์ˆ˜ ๊ฐ€์žฅ ๋งŽ์€ ๊ฒƒ ์ฝ๊ธฐ */
    int max = 0;
    for (int i = 0; i < n; i++) {
        sushi_set[i].size() > max ? max = sushi_set[i].size() : max;
    }

    printf("%d", max);
}

set, vector๋ฅผ ์ด์šฉํ•ด์„œ ๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„

๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ

vector<set<int>> ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ˆ๋ฌด ์žก์•„๋จน๋Š” ๋“ฏํ•จ => k๊ฐœ์”ฉ ๋ฐ›์•„์˜ค๋Š” ์ˆœ๊ฐ„ max๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝ

<๋‘๋ฒˆ์งธ ์ฝ”๋“œ>

#include <iostream>
#include <set>

using namespace std;

int sushi_belt[3000000];

int main() {
    int n, d, k, c;
    scanf("%d %d %d %d", &n, &d, &k, &c);
    for (int i = 0; i < n; i++)
        scanf("%d", &sushi_belt[i]);

    /* ์ดˆ๋ฐฅ k๊ฐœ์”ฉ ๋Š์–ด ์ฝ๊ธฐ */
    int max = 0;
    int skip_num;
    int skip = 0;
    for (int i = 0; i < n; i++) {
        set<int> sushi_set;
        skip_num = 0;
        skip = 0;
        for (int j = 0; j < k; j++) {
            if (skip_num >= k + 1 - max) {// ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ max ๊ฒฝ์šฐ๋ณด๋‹ค ๋งŽ์•„์ง€๋ฉด ๋ฐ”๋กœ break
                // ์ œ์ผ ๋งŽ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ์ข…๋ฅ˜์˜ ์ˆ˜ k+1 - ์ด๋•Œ๊ป ๋‚˜์˜จ ์ตœ๋Œ€ ์ข…๋ฅ˜์˜ ์ˆ˜ max
                skip = 1;
                break;
            }
            int tmp = (i + j > n - 1) ? i + j - n : i + j; // ์›ํ˜• ๊ณ ๋ ค
            int compare_size = sushi_set.size();
            sushi_set.insert(sushi_belt[tmp]);
            if (sushi_set.size() == compare_size) { // ์ค‘๋ณต์œผ๋กœ ๋“ค์–ด์˜ค๋ฉด
                skip_num++;
            }
        }
        if (skip)
            continue;
        sushi_set.insert(c);
        if(sushi_set.size() > max)
            max = sushi_set.size(); // ๊ฐ€์ง“ ์ˆ˜ ๋งŽ์€ ๊ฑธ๋กœ max ์ฑ„์šฐ๊ธฐ
    }

    printf("%d", max);
}

์‹œ๊ฐ„์ดˆ๊ณผ

์ค‘๊ฐ„์— skip ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ดˆ๊ณผ ..

์‹œ๊ฐ„ ๋ณต์žก๋„ ์ตœ๋Œ€๋กœ ๊ณ„์‚ฐํ•ด๋ณด๋‹ˆ 9*10^9 ์ด๋ผ ์œ„ํ—˜ํ•˜๊ธด ํ•จ! ํ•˜์ง€๋งŒ ์ค„์ผ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Œ

<์„ธ๋ฒˆ์งธ ์ฝ”๋“œ>

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

int sushi_belt[3000000];
int sushi_kind[3001] = { 0 };

int main() {
    int n, d, k, c; 
    scanf("%d %d %d %d", &n, &d, &k, &c);
    for (int i = 0; i < n; i++)
        scanf("%d", &sushi_belt[i]);

    int index = 0;
    int kind = 0;
    queue<int> sushi_list;
    for (int i = 0; i < k; i++) {
        sushi_list.push(sushi_belt[i]);
        if (!sushi_kind[sushi_belt[i]]++) {
            kind++;
        }
    }
    int max = kind;

    /* ์ดˆ๋ฐฅ k๊ฐœ์”ฉ ๋Š์–ด ์ฝ๊ธฐ */
    for (int i = k; i < n+k-1; i++) {
        if (!(--sushi_kind[sushi_list.front()])) {
            kind--;
        }
        sushi_list.pop();
        if (!sushi_kind[sushi_belt[i % n]]++) {
            kind++;
        }
        sushi_list.push(sushi_belt[i % n]);
        if (!sushi_kind[c]) {
            if (kind + 1 > max)
                max = kind + 1;
        }
        else {
            if (kind > max)
                max = kind;
        }
    }


    printf("%d", max);
}

์ •๋‹ต!

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.

 

<์ฃผ์˜>

 ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์—์„œ ์ž˜ ๊ธฐ์žฌ๊ฐ€ ์•ˆ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ ์ดˆ๋ฐฅ์˜ ์ข…๋ฅ˜์ธ d๊ฐ€ 3์ด๋ผ๊ณ  ํ•˜๋ฉด ์ดˆ๋ฐฅ์€ 1,2,3 ์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค(index๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘). ๊ทธ๋ž˜์„œ sushi_kind๋ผ๋Š” ๋ฐฐ์—ด์€ 3001๊ฐœ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค.

 ๊ธฐ์กด์—๋„ queue์— ํ•˜๋‚˜์”ฉ ๋„ฃ๊ณ  ๋นผ๋ฉด์„œ n๋ฒˆ์˜ for๋ฌธ ํ•œ ๋ฒˆ๋งŒ ๋„๋Š” ๋ฐฉ๋ฒ•์€ ์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ, ๋ฝ‘์€ k๊ฐœ์˜ ์ดˆ๋ฐฅ์˜ ์ข…๋ฅ˜๋ฅผ ๋ณ€์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ๋ชปํ•˜๊ณ  k๋ฒˆ์˜ for๋ฌธ์„ ์•ˆ์—์„œ ๋Œ์•„์•ผ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณต์žก๋„๊ฐ€ ๋น„์Šทํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ kind ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด O(nk)์—์„œ O(n)์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

=> ๋„ˆ๋ฌด ์‰ฝ๊ฒŒ ํฌ๊ธฐํ•˜๊ณ  ๋‹ต์„ ๋ณธ ๊ฒƒ ๊ฐ™์•„ ๋ฏผ๋งํ•˜๊ตฐ..

 

<๋ฐฐ์šด ๊ฒƒ>

  1. ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹

ํ•˜๋‚˜์”ฉ ๋นผ๊ณ  ๋„ฃ๊ณ  ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค.

  1. ์›ํ˜•์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๊ทธ๋ƒฅ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

n๋ณด๋‹ค ํฐ index์—์„œ์˜ ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•˜๋ ค๋ฉด index%n์„ ํ•ด์ฃผ๋ฉด ์›ํ˜•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ์ฟ ํฐ์„ ์ค€ c ์ดˆ๋ฐฅ

c ์ดˆ๋ฐฅ์€ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ๋‹ค์‹œ ๋นผ์ฃผ์–ด์•ผํ•˜๋ฏ€๋กœ ๊ทธ๋ƒฅ kind ๊ณ„์‚ฐ์—๋งŒ ๊ณ ๋ คํ•˜์˜€๋‹ค.

๋ฐ˜์‘ํ˜•