알고리즘/BOJ

백준 5525번 IOIOI

꾸준함. 2018. 10. 28. 02:30

문제 링크입니다: https://www.acmicpc.net/problem/5525


직관적으로 O(N^2)으로 풀면 TLE가 발생하는 문제입니다.

따라서, 시간 복잡도를 O(N)으로 줄여야합니다.


핵심은 O의 개수를 통해 Pn인지를 파악하는 것이였습니다.

물론, OO와 같이 예외가 발생할 수 있으므로 조건문을 통해 OI가 연속으로 등장하는지 파악합니다.

검사할 때 첫 번째로 등장한 O는 이후에는 안 쓰이므로 다음 Pn을 검사할 때는 해당 O는 제외함으로써 시간 복잡도 O(N)으로 문제를 풀 수 있습니다.


#include <iostream>

#include <string>

using namespace std;

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0);

        int N, len;

        string s;

        cin >> N >> len >> s;

 

        int result = 0;

        //O(N)으로 풀어야한다

        for (int i = 0; i < s.length(); i++)

        {

                 if (s[i + 1] == 'O' && s[i + 2] == 'I')

                 {

                         //O의 개수가 중요

                         int O = 0;

                         while (s[i] == 'I' && s[i + 1] == 'O')

                         {

                                 i += 2;

                                 O++;

                                 if (s[i] == 'I' && O == N)

                                 {

                                          O--; //이전 O는 확인 안해도 된다

                                          result++;

                                 }

                         }

                 }

        }

        cout << result << "\n";

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 2810번 컵홀더  (0) 2018.10.28
백준 9536번 여우는 어떻게 울지?  (0) 2018.10.28
백준 1062번 가르침  (5) 2018.10.28
백준 2804번 크로스워드 만들기  (0) 2018.10.27
백준 10769번 행복한지 슬픈지  (0) 2018.10.27