정화 코딩

[C++] IOIOI (백준 5525번) 본문

PS

[C++] IOIOI (백준 5525번)

jungh150c 2024. 9. 3. 01:29

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

 

#include <iostream>
#include <string>
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    string str;
    cin >> n >> m >> str;

    int l = 2 * n + 1;
    string ioi = "";
    for (int i = 0; i < n; i++) ioi += "IO";
    ioi += "I";

    int cnt = 0;
    for (int i = 0; i <= m - l; i++) {
        if (str.substr(i, l) == ioi) cnt++;
    }

    cout << cnt << '\n';
}

이 문제는 서브태스크 문제였는데, 이 코드로는 50점이 나온다. 앞에서부터 substring을 하나하나 비교하는 방식인데, 정답을 받으려면 더 빠른 방법이 필요한 것 같다. (PA)

 

#include <iostream>
#include <string>
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    string str;
    cin >> n >> m >> str;

    int cnt = 0;
    for (int i = 0; i < m; i++) {
        int tmp = 0;
        if (str[i] == 'O') continue;
        while (str[i + 1] == 'O' && str[i + 2] == 'I') {
            tmp++;
            if (tmp == n) {
                cnt++;
                tmp--;
            }
            i += 2;
        }
    }

    cout << cnt << '\n';
}

잘 안 떠올라서 구글링을 통해 풀었다.. ㅎㅎ substring 한번 비교하고, 한칸 뒤에서 다시 확인하고... 이렇게 하는게 아니라 한번에 연속적으로 읽으면서 체크하는 방식이다. PN은 결국 P1이 여러개 모여서 만들어진 것이라는 아이디어가 사용된 것 같다. 

아 그리고 for 반복문 안에 i 값을 변화시키는 건 처음 해봤다. 이렇게 편하게 사용할 수도 있구나..!!! (AC)

 

'PS' 카테고리의 다른 글

[C++] 카잉 달력 (백준 6064번)  (0) 2024.09.03
[C++] 소-난다! (백준 19699번)  (0) 2024.09.03
[C++] DSLR (백준 9019번)  (0) 2024.08.07
[C++] 과일 탕후루 (백준 30804번)  (0) 2024.08.07
[C++] 이중 우선순위 큐 (백준 7662번)  (0) 2024.08.06
Comments