카테고리 없음
[백준] 5525번 IOIOI - C++
거북이 코딩
2024. 10. 21. 18:08
IOIOI
P(N) : P(1) = "IOI", P(2) = "IOIOI", P(3) = "IOIOIOI",... 일 때 주어진 문자열 S에 P(N)이 몇 군데 포함되어 있는지 출력하는 문제입니다.
입력
첫째 줄에 N, 둘째 줄에 S의 길이 M, 셋째 줄에 S가 주어진다.
출력
S에 P(N)이 몇 군데 포함되어 있는지 출력한다. (P(N) 끼리 겹칠 수 있음)
알고리즘
// KMP 알고리즘을 응용했다.
while(i=0;i<m;++i)
{
if(이전에 P(N)을 찾았다면)
if(앞의 두 문자가 "OI"라면)
count++;
else
continue;
else
for(int j=0;j<P(N).size();++j)
if(일치하지 않는다면)
i+=j;
if(P(N)을 찾았다면)
count++;
}
코드
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, m, cnt = 0;
string s;
cin >> n >> m >> s;
int cmp_len = 1 + 2 * n;
bool prev_cmp = false;
for (int i = 0; i < m - 1;)
{
if (prev_cmp)
{
if (s[i] == 'O' && s[i + 1] == 'I')
{
++cnt;
i += 2;
}
else
{
prev_cmp = false;
}
}
else
{
bool is_crt = true;
for (int j = 0; j < cmp_len; ++j)
{
if (j % 2 == 0)
{
if (s[i + j] != 'I')
{
is_crt = false;
i += j + 1;
break;
}
}
else
{
if (s[i + j] != 'O')
{
is_crt = false;
i += j;
break;
}
}
}
if (is_crt)
{
++cnt;
prev_cmp = true;
i += cmp_len;
}
}
}
cout << cnt;
return 0;
}
마치며
지난 학기 수강했던 자료구조에서 배운 KMP 알고리즘이 생각나서 조금 응용해서 해결해 봤습니다. 학교를 다니며 배운 지식이 사용되니까 뭔가 수업 열심히 듣길 잘했다는 생각이 듭니다.