[๋ฐฑ์ค€ 5525] IOIOI

๋„์œคยท2023๋…„ 7์›” 23์ผ
0

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
52/71

๐Ÿ”—์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

๋กœ์ง ์ž์ฒด๋Š” ๊ธˆ๋ฐฉ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋‚˜ ๋นผ๋จน์–ด์„œ ์˜ค๋ž˜๊ฑธ๋ฆฐ ๋ฌธ์ œ ๋ฐ˜๋ก€๋ฅผ ์ง์ ‘ ์ƒ๊ฐํ•˜๋Š” ํž˜์ด ์•„์ง ๋ถ€์กฑํ•˜๊ตฌ๋‚˜๋ผ๋Š” ๊ฒƒ์„ ๋ผˆ์ ธ๋ฆฌ๊ฒŒ ๋А๊ผ‡๋‹ค...

๋ฌธ์ œ ๋ถ„์„

์ด ๋ฌธ์ œ๋Š” ๋ฌธ์ž์—ด ์†์— P๋ฌธ์ž์—ด์ด ๋ช‡ ๊ฐœ ๋“ค์–ด์žˆ๋Š”์ง€ ์ฐพ์•„๋‚ด๋Š” ๋ฌธ์ œ์ด๋‹ค.

P๋ฌธ์ž์—ด์€ N+1๊ฐœ์˜ I์™€ N๊ฐœ์˜ O๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.

p = IOI
s = OOIOIOIO

OO [IOI] OIO
OOIO [IOI] O

๋ฐœ์ƒ & ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„

์ฒ˜์Œ์—๋Š” P๋ฌธ์ž์—ด์˜ ๊ธธ์ด ๋งŒํผ ํƒ์ƒ‰ํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ํ™•์ธํ•˜๋Š” Check๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

bool check(int idx, string &t, const string &s){
    if(idx < t.length() - 1)
        return false;

    string temp = "";

    for(int i = 0; i < t.length(); i++){
        temp.push_back(s[idx - i]);
    }

    return temp == t;
}

ํƒ์ƒ‰์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ ธ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ P๋ฌธ์ž์—ด์ด ์‹œ์ž‘๋˜๋ฉด OI์˜ ์ˆซ์ž๋ฅผ ์„ธ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋กœ์ง์„ ๊ต์ฒดํ•˜์˜€๋‹ค.

for(int i = 0; i < m - 1; i++){
    if(isStart){
        if(s[i] == 'O' && s[i + 1] == 'I'){
            ++temp;
            ++i;
        }
        else{
            isStart = false;
            if(temp >= n){
                answer += temp - (n - 1);
            }
            temp = 0;
        }
    }

    if(!isStart && s[i] == 'I')
        isStart = true;
}

์‹œ๊ฐ„์€ O(n)์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ฒน์ณ์žˆ๋Š” P๋ฌธ์ž์—ด(IOIOI)๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ์•Œ์•„์•ผ ํ•  ์ ์€ P3๋ฌธ์ž์—ด์ด ๋ฌธ์ž์—ด ์†์— ์žˆ์„ ๊ฒฝ์šฐ P1 ๋ฌธ์ž์—ด์ด 3๊ฐœ ์กด์žฌํ•จ์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

OO [IOIOIOI]

OO [IOI] OIOI
OOIO [IOI] OI
OOIOIO [IOI]

P3 ๋ฌธ์ž์—ด์ด ์กด์žฌํ•จ => P1 ๋ฌธ์ž์—ด์€ 3๊ฐœ ์กด์žฌํ•จ

ํ•ด๋‹น ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๊ฒน์นœ ๋ฌธ์ž์—ด๋„ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๋กœ์ง์„ ์ˆ˜์ •ํ•˜์˜€๋‹ค.

์ฝ”๋“œ

#include <iostream>

using namespace std;

int main(){
    int n;
    int m;

    int answer = 0;
    int temp = 0;

    bool isStart = false;

    string s;

    cin >> n >> m >> s;

    for(int i = 0; i < m - 1; i++){
        if(isStart){
            if(s[i] == 'O' && s[i + 1] == 'I'){
                ++temp;
                ++i;
            }
            else{
                isStart = false;
                if(temp >= n){
                    answer += temp - (n - 1);
                }
                temp = 0;
            }
        }

        if(!isStart && s[i] == 'I')
            isStart = true;
    }

    if(isStart && temp >= n)
        answer += temp - (n - 1);

    cout << answer;
}
profile
Game Client Developer

0๊ฐœ์˜ ๋Œ“๊ธ€