백준/Inha Algorithm Study Group

DAY3 고급 - 백준 16120번 (C++)

FDEE 2020. 9. 4. 17:42

www.acmicpc.net/problem/16120

 

16120번: PPAP

첫 번째 줄에 문자열이 주어진다. 문자열은 대문자 알파벳 P와 A로만 이루어져 있으며, 문자열의 길이는 1 이상 1,000,000 이하이다.

www.acmicpc.net

 

<답안>

#include <iostream>
using namespace std;
int main()
{
    int Pcount = 0;
    string input;
    cin>>input;

    for(int i=0; i<input.size(); i++)
    {
        if(input[i] == 'P')
        {
            Pcount++;
        }
        else if(input[i] == 'A')
        {
            if(Pcount >= 2 && input[i+1] == 'P')
            {
                Pcount--;
                i++;
            }
            else
            {
                cout << "NP"<<"\n";
                return 0;
            }
        }
        else
        {
            cout << "NP"<<"\n";
            return 0;
        }
    }
    if(Pcount == 1)
        cout<<"PPAP"<<"\n";
    else
        cout<<"NP"<<"\n";
    return 0;
}

 

<설명>

쉽사리 접근이 안되어 블로그를 참고하여 힌트를 얻었었다.. 키포인트는"P"의 누적개수였다

"P"일때 Pcount를 계속 증가시키다가 "A"가 입력된 경우

Pcount가 2이상 (2여야만 하진 않는다는점 주의!) 이고, 뒷글자 input[i+1]이 "P" 인 경우

 

다시말해 "A" 기준으로 앞에 "PP"가 있고, 뒤에 "P"가 있는경우

-> 누적된 Pcount를 1 감소시키고 (PP 까지 2인 상태에서 PPAP를 P 하나로 취급해야하기 때문에 2 -> 1로 -1 해야한다)

뒷글자 P를 확인하였기 때문에 i를 1 증가시켜준다

 

이렇게 글자 확인이 끝난 후 P의 개수 Pcount가 1이여야만 한다 (PPAP의 마지막 P = 1) 그러면 PPAP를 출력한다

 

그 외의 경우는 NP를 출력한다