백준

[C++] 백준 5525번 IOIOI

MINU.SHINNNN 2023. 1. 28. 14:54

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

풀이

Find, substr을 사용할 경우 시간초과로 50점만 받을 수 있다.

1. O(N)으로 해결하기 위해, "I"로 시작하는 지점을 찾고, 그 지점부터 "OI"가 나올 때마다 카운트 해준다.

2. 카운트가 N과 같아질 경우 원하는 문자열이므로 정답에 추가한다. 이때, k값을 -- 해줘야 한다.(찾은 문자열에서 가장 앞의 "IO"하나 빼주기로 생각)

3. i는 다음 OI를 찾아야 하므로 i+=2로 계속해서 탐색한다.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int N, M, res;
string org;
// N은 o의 개수, M은 str길이, I뒤에 OI가 N개 붙어있는게 몇개
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    // freopen("input.txt", "r", stdin);
    cin >> N;
    cin >> M;
    cin >> org;

    for (int i=0; i<M; i++){
        int k=0;
        if (org[i]=='O') continue;

        while (org[i+1]=='O' && org[i+2]=='I'){
            k++;

            if (k==N) {
                res++;
                k--;
            }
            i += 2;
        }
    }

    cout << res << endl;
    return 0;
}