๋ก์ง ์์ฒด๋ ๊ธ๋ฐฉ ์์ฑํ์ง๋ง ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋นผ๋จน์ด์ ์ค๋๊ฑธ๋ฆฐ ๋ฌธ์ ๋ฐ๋ก๋ฅผ ์ง์ ์๊ฐํ๋ ํ์ด ์์ง ๋ถ์กฑํ๊ตฌ๋๋ผ๋ ๊ฒ์ ๋ผ์ ธ๋ฆฌ๊ฒ ๋๊ผ๋ค...
์ด ๋ฌธ์ ๋ ๋ฌธ์์ด ์์ 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;
}