알고리즘/BOJ

백준 16120번 PPAP

꾸준함. 2019. 10. 22. 11:28

문제 링크입니다: https://www.acmicpc.net/problem/16120

 

16120번: PPAP

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

www.acmicpc.net

문자열의 길이가 최대 1,000,000이기 때문에 O(N)으로 풀어야하는 문제였습니다.

 

알고리즘은 아래와 같습니다.

* cnt는 'P'가 연속해서 나오는 횟수

 

1. 현재 인덱스가 'P'라면 cnt를 증가시킵니다.

 

2. 현재 인덱스가 'A'라면

2-1. 앞에 연속해서 P가 2개 이상 나왔고 바로 뒤에 문자가 P라면 PPAP 조건 성립하므로 해당 PPAP 문자열을 P로 치환 따라서 cnt를 하나 감소시킵니다.

2-2. 2-1을 성립하지 않을 경우 NP 출력 후 프로그램 종료

 

3. 문자열을 쭉 탐색한 뒤 마지막 P가 연속해서 한번 등장하면 바로 앞에가 A이므로 PPAP 문자열 성립

3-1. 3번 성립하지 않을 경우 NP 출력

 

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string s;
cin >> s;
int cnt = 0;
for (int i = 0; i < s.length(); i++)
{
// P라면 개수 증가
if (s[i] == 'P')
{
cnt++;
continue;
}
// 현재 A이고 앞에 두개 이상이 P이고 뒤에가 P이면 PPAP
if (cnt >= 2 && s[i + 1] == 'P')
{
// PPAP는 P로 치환 -> cnt--
cnt--;
// 뒤에 P까지 확인했으므로 i++
i++;
}
else
{
cout << "NP\n";
return 0;
}
}
// P로 끝나야 PPAP
if (cnt == 1)
{
cout << "PPAP\n";
}
else
{
cout << "NP\n";
}
return 0;
}
view raw .cpp hosted with ❤ by GitHub

개발환경:Visual Studio 2017

 

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 15656번 N과 M (7)  (2) 2019.10.22
백준 10867번 중복 빼고 정렬하기  (0) 2019.10.22
백준 2012번 등수 매기기  (0) 2019.10.22
백준 2457번 공주님의 정원  (0) 2019.10.22
백준 3036번 링  (0) 2019.10.21