Post

BOJ 16120 PPAP

BOJ 16120 PPAP

https://www.acmicpc.net/problem/16120

문제

bryan은 PPAP를 좋아한다. bryan은 어떻게 하면 사람들에게 PPAP를 전파할 수 있을까 고민하던 중 PPAP 문자열이라는 것을 고안하게 되었다.

PPAP 문자열은 문자열 P에서 시작하여, 문자열 내의 P를 PPAP로 바꾸는 과정을 반복하여 만들 수 있는 문자열로 정의된다. 정확하게는 다음과 같이 정의된다.

  • P는 PPAP 문자열이다.
  • PPAP 문자열에서 P 하나를 PPAP로 바꾼 문자열은 PPAP 문자열이다.

예를 들어 PPAP는 PPAP 문자열이다. 또한, PPAP의 두 번째 P를 PPAP로 바꾼 PPPAPAP 역시 PPAP 문자열이다.

문자열이 주어졌을 때, 이 문자열이 PPAP 문자열인지 아닌지를 알려주는 프로그램을 작성하여라.


입력

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


출력

첫 번째 줄에 주어진 문자열이 PPAP 문자열이면 PPAP를, 아닌 경우 NP를 출력한다.


예제 입력 1

PPPAPAP

예제 출력 1

PPAP

예제 입력 2

PPAPAPP

예제 출력 2

NP

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Deque<Character> deque = new ArrayDeque<>();
        String ppa = "PPA";
        char input = (char) br.read();
        while (input != '\n') {
            // 덱에 있는 문자열의 길이가 PPA의 길이인 3보다 크고 입력받은 문자가 P일 경우에만 PPAP와 같은지 검사 진행
            if(deque.size() >= ppa.length() && input == 'P') {
                // 가장 최근 덱에 push한 문자를 포함한 3개의 문자가 PPA와 같은지 검사
                Iterator<Character> iterator = deque.iterator();
                int i = ppa.length() - 1;
                for (; i >= 0 && ppa.charAt(i) == iterator.next(); i--) ;

                // 만약 검사한 문자들이 PPA와 같을 경우, 해당 문자들을 pop
                if (i < 0) {
                    for (int j = 0; j < ppa.length(); j++) deque.pop();
                }
            }

            deque.push(input);
            input = (char) br.read();
        }

        // 덱에 문자 P만 남아있을 경우 PPAP 출력, 아니면 NP 출력
        System.out.println(deque.size() == 1 && deque.pop() == 'P' ? "PPAP" : "NP");
    }
}
This post is licensed under CC BY 4.0 by the author.