문제 링크입니다: 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 출력
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |


개발환경: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 |