이번 문제는 Greedy 알고리즘을 통해 해결하였다. PPAP 문자열에서 P 하나를 PPAP로 바꾼 문자열이 PPAP가 된다는 정의에서 이해가 조금 필요했다.
이 정의를 간단한 예시들로 정리해보면 PPAP
-> PPAPPAP
(1번 P가 PPAP가 된 경우), PPPAPAP
(2번 P가 PPAP가 된 경우), PPAPPAP
(3번 P가 PPAP가 된 경우)로 변할 수 있고, 이 문자열 모두 PPAP에 해당한다는 것이다.
규칙을 찾는데 시간이 조금 걸렸다.
규칙을 바탕으로 다음과 같이 해결하였다.
xcode에서는 잘 실행됐지만 백준에 제출을 하니 70%대에서 오답처리 되었다. 반례를 생각하다가 PPPP는 PPAP가 아니라는 것을 생각하게 되었다. 본인이 작성한 코드에서는 PPPP도 true로 반환되기 때문에 오답처리된 것이었다.
PPAP
-> st:+P
, +P
, -P
, -P
, +P
st.size()=1PPPAPAP
-> st:+P
, +P
, +P
, -P
, -P
, +P
, -P
, -P
, +P
st.size()=1PPPP
-> st: +P
, +P
, +P
, +P
st.size()=4#include <iostream>
#include <string>
#include <vector>
using namespace std;
string ppap;
vector<int> st;
void Input(){
cin>>ppap;
}
bool Solution(){
if(ppap.size()==1&&ppap.front()=='P'){
st.push_back('P');
}
else{
for(int i=0; i<ppap.size(); i++){
if(ppap[i]=='P'){
st.push_back('P');
}
else if(st.size()>=2&&ppap[i+1]=='P'){
st.pop_back();
st.pop_back();
}
else{
return false;
}
}
}
if(st.size()==1)
return true;
else
return false;
}
void Solve(){
if(Solution())
cout<<"PPAP"<<endl;
else
cout<<"NP"<<endl;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
Solve();
return 0;
}