코딩가딩가

[JAVA]BOJ 16120, PPAP

Noooodle 2024. 8. 31. 19:16

문제에서 요구하는게 무엇인지, 문제를 잘 읽어야 한다.

 

PPAP문자열이란 P에서 시작해 문자내의 P를 "PPAP"로 바꾼 문자열을 말한다. "P"는 PPAP문자열이고, "PPAP"는 PPAP문자열이다. "PPAPPAP"도 PPAP 문자열이다. "PPAPPAPPAP"도 PPAP문자열이다.

PPAP문자열이 아닌것은 PAPPP, PPAPP, PP 등이 있다. P에서 시작해 P가 PPAP로 치환되는 모든 경우의 수가 PPAP문자열이다. 단순히 PPAP만 있다고 PPAP문자열이 아니다. P, PPAP, (PPAP)PAP, P(PPAP)AP, PPA(PPAP), ((PPAP)PAP)PAP ... 등이 PPAP문자열이다.

 

입력받은 String이 PPAP문자열인지 확인하기위해 스택을 사용했다. 

1. String을 한 글자씩 스택에 넣는다.

2. 스택 사이즈가 4 이상이면서 "PPAP"인 경우 "PPAP"를 빼고(pop) 'P'를 넣는다.(push)

3. PPAP 문자열이라면 1, 2 를 반복했을때 스택에 'P'만 남는다.

 

주의사항은 스택에는 거꾸로 들어가므로 한글자씩 'P' 'P' 'A' 'P' 인지 확인하면 안되고 'P' 'A' 'P' 'P' 인지 확인해야 한다.

 


아래는 전체 코드이다.

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

public class BOJ16120 {
    public static void main(String[] args) throws IOException {
        // 스택에 p만 남아야 ppap 문자열임
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Character> stack = new Stack<>();
        String str;
        int i;

        str = br.readLine();

        for(i=0;i<str.length();i++){
            // 일단 스택에 넣기
            stack.push(str.charAt(i));

            // 스택사이즈가 4 이상이면서 ppap인 경우 -> p로 바꾸기
            if(stack.size() >= 4){
                if(stack.get(stack.size()-1) == 'P' &&  stack.get(stack.size()-2) == 'A'
                        && stack.get(stack.size()-3) == 'P' && stack.get(stack.size()-4) == 'P'){
                    stack.pop();
                    stack.pop();
                    stack.pop();
                    stack.pop();
                    stack.push('P');
                }
            }
        }
        if(stack.peek() == 'P' && stack.size() == 1)
            System.out.println("PPAP");
        else
            System.out.println("NP");
    }
}

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 17298, 오큰수  (1) 2024.09.01
[JAVA]BOJ 1874, 스택 수열  (0) 2024.08.31
[JAVA]BOJ 5397, 키로거  (0) 2024.08.29
[JAVA]BOJ 2504, 괄호의 값  (1) 2024.08.29
[JAVA]BOJ 10799, 쇠막대기  (0) 2024.08.25