알고리즘

[백준] 문제 16120번 : PPAP - JAVA

DoosanBaek 2024. 11. 26. 20:36

[링크] https://www.acmicpc.net/problem/16120

더보기

문제 )


💎 문제 분석 & 제약 조건

문제 분석 : 

PPAP 문자열은 문자열 P 에서 시작하여, 문자열 내의 P를 PPAP로 바꾸는 과정을 반복하여 만들 수 있는 문자열로 정의됨문자열이 주어졌을 때, 이 문자열이 PPAP 문자열인지 아닌지 알려주는 프로그램 작성

제약 조건 : 

문자열은 대문자 알파벳 P A로만 이루어져 있으며, 문자열의 길이는 1 이상 1,000,000 이하


🚀 의사 결정

1.  반복문으로 문자열 순차적으로 검사

2. P가 올 경우 카운트 증가 시키고, 

3. A가 올 경우 A가 오기 전에 P 가 충분하지 않으면 규칙위반으로 false 리턴

4.A가 올 경우 A 뒤에 반드시 P가 와야 하므로, 다음 문자가 P 인지 확인

5. A 뒤에 P 가 없으면 규칙 위반으로 false 리턴

6. 마지막에 정확히 하나의 P 만 남아 있어야 PPAP 성립 


📜 소스코드(Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

            // PPAP 규칙을 확인하고 결과를 출력
            if(checkPPAP(str)) {
                System.out.println("PPAP");

            } else {
                System.out.println("NP");
            }

    }

    private static boolean checkPPAP(String str) {
        int pCount = 0;

        // 문자열을 순차적으로 검사
        for (int i = 0; i < str.length(); i++) {
            char cur = str.charAt(i);

            // 'P'가 오면 카운트 증가
            if (cur == 'P') {
                pCount++;

            // 'A'가 오면 이전에 두 개 이상의 'P'가 있어야 함
            } else if (cur == 'A' && pCount >= 2) {

                // 'A' 뒤에 반드시 'P'가 와야 하므로 다음 문자가 'P'인지 확인
                if (i < str.length() - 1 && str.charAt(i + 1) == 'P') {
                    // 'P' 두 개를 하나로 합치면서 카운트 감소
                    pCount--;

                    // 'P'를 하나 건너뛰어 처리
                    i++;

                } else {
                    // 'A' 뒤에 'P'가 없으면 규칙 위반
                    return false;
                }

            } else {
                // 'A'가 오기 전에 'P'가 충분하지 않으면 규칙 위반
                return false;
            }

        }

        // 마지막에 정확히 하나의 'P'만 남아 있어야 PPAP가 성립
        return pCount == 1;
    }
}