스택
자료구조
스택을 이용한 풀이는 항상 바로 안떠오르는 것 같다. 스택을 이용하면 쉽게 풀이할 수 있다.
문제의 규칙은 p
로 시작해서 p
-> ppap
로 바꾸는 과정에서 생기는 모든 문자열을 ppap
문자열이라고 정의한다. p
도 ppap
문자열
입력 문자열을 처음부터 stack
에 넣으면서 크기가 4이상이면 4개를 꺼내서 ppap
인지 확인하고 ppap
이면 p
로 바꾸어 stack
에 넣어준다.
연산 마지막 결과가 p
이면 PPAP
를 출력하고 아니면 NP
를 출력
#include <bits/stdc++.h>
using namespace std;
string str;
vector<char> v;
int main() {
cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false);
cin >> str;
v.push_back(str[0]);
for (int i = 1; i <= str.size(); i++) {
while (v.size() >= 4) {
char a = v.back(); v.pop_back();
char b = v.back(); v.pop_back();
char c = v.back(); v.pop_back();
char d = v.back(); v.pop_back();
if (d == 'P' && c == 'P' && b == 'A' && a == 'P') {
v.push_back('P');
}
else {
v.push_back(d); v.push_back(c); v.push_back(b); v.push_back(a);
break;
}
}
if (i == str.size()) break;
v.push_back(str[i]);
}
if (v.size() == 1 && v[0] == 'P') cout << "PPAP";
else cout << "NP";
return 0;
}