[C++] BOJ #16120 PPAP
Posted on 2022. 02. 05
문제
bryan은 PPAP를 좋아한다. bryan은 어떻게 하면 사람들에게 PPAP를 전파할 수 있을까 고민하던 중 PPAP 문자열이라는 것을 고안하게 되었다.
PPAP 문자열은 문자열 P에서 시작하여, 문자열 내의 P를 PPAP로 바꾸는 과정을 반복하여 만들 수 있는 문자열로 정의된다. 정확하게는 다음과 같이 정의된다.
- P는 PPAP 문자열이다.
- PPAP 문자열에서 P 하나를 PPAP로 바꾼 문자열은 PPAP 문자열이다.
예를 들어 PPAP는 PPAP 문자열이다. 또한, PPAP의 두 번째 P를 PPAP로 바꾼 PPPAPAP 역시 PPAP 문자열이다.
문자열이 주어졌을 때, 이 문자열이 PPAP 문자열인지 아닌지를 알려주는 프로그램을 작성하여라.
입력
- 첫 번째 줄에 문자열이 주어진다. 문자열은 대문자 알파벳 P와 A로만 이루어져 있으며, 문자열의 길이는 1 이상 1,000,000 이하이다.
출력
- 첫 번째 줄에 주어진 문자열이 PPAP 문자열이면 PPAP를, 아닌 경우 NP를 출력한다.
1. 기본 아이디어 및 소스코드
- P가 나오면 일단
pcount
를 하나 증가시킨다. - A가 나오면, 앞에 P가 2개 이상 있어야하므로,
pcount >= 2
인지 확인해준다.- A 바로 뒤의 글자가 P이면
pcount
를 하나 내려준다. - A 바로 뒤의 글자가 A라면 A가 연속해서 두 개 나오는 경우는 PPAP 문자열이 될 수 없으므로
NP
출력 후 종료
- A 바로 뒤의 글자가 P이면
- 최종 결과가
pcount == 1
이라면 PPAP 문자열이고, 아니면 아닌거다.
#include <iostream>
#include <cstring>
int main()
{
char str[1000001];
int pcount = 0;
scanf("%s", str);
for (int i = 0; i < strlen(str); i++)
{
if (str[i] == 'P')
pcount++;
else if (str[i] == 'A')
{
if (pcount >= 2 && str[i + 1] == 'P')
{
pcount--;
i++;
}
else
{
printf("NP\n");
return 0;
}
}
}
if (pcount == 1)
printf("PPAP\n");
else
printf("NP\n");
}