[문제]
https://www.acmicpc.net/problem/16120
- P는 PPAP이다
- PPAP는 PPAP다
- P(PPAP)AP 는 PPAP다
- PPA(PPAP)는 PPAP다
- PP는 NP다. 왜냐하면 PP중 하나를 PPAP문자열로 바꾸면 PPAPP가 되기때문에 이는 PPAP에 해당하지 않는다
⇒ 입력으로 받은 문자열이 PPAP문자열이면 PPAP를 아니라면NP를 출력
[문제풀이]
처음에는 JAVA가지고 정규식으로 풀려고 노력했지만...틀렸습니다와 시간초과의 향연..
결국 그냥 다른 방법으로 풀기로했다
문자열로 받은다음에 C++특성상 받으면 문자열배열이 되기때문에
바로 접근하도록한다
예제로 PPPAPAP를 보겠다.
- 현재 문자가 P니까 one을 하나 증가시킨다
- 현재 = P one++
- 현재 = P one++(현재 one = 3)
- 현재 = A니까 두번째 조건문으로 향하게 되고 one이 2이상이고,지금 나 다음 문자가 P가 맞으므로 one을 하나 감소(one = 2)시키고 i(현재 커서)를 다음으로 이동시킨다→ 커서의 상태 = P
- 현재 = A (P에서 그 다음이므로) 니까 또 두번째 if문으로 가게된다. one ≥2 && 나 다음도 P가 맞으므로 one 1 감소시키고 커서도 다음으로 옮긴다 cursor = P
- 문자열 길이만큼 다 돌았으므로 for문이 끝났기때문에 for문 밖의 조건문실행
- one == 1이므로 PPAP출력!
one이라는 변수를 cursor역할을 하게 함으로써 PPAP인지 체크하도록 하면된다
[전체코드]
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cin >> str;
int one = 0;
for(int i = 0; i < str.length(); i++){
if(str[i] == 'P'){
one++;
continue; //esle안쓰고 -> 시간 줄이기 위해
}
if(one >=2 && str[i+1] == 'P'){
one--;
i++;
}
else{
cout << "NP\n";
return 0;
}
}
if(one == 1) cout << "PPAP\n";
else cout << "NP\n";
return 0;
}
'📚 알고리즘 > 탐욕(Greedy)' 카테고리의 다른 글
[백준 2212] 센서_greedy(C++) (0) | 2020.07.11 |
---|