[백준/파이썬] 16120 PPAP

#문제링크

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

 

16120번: PPAP

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

www.acmicpc.net

#나의풀이

import sys
from collections import deque

if __name__=="__main__":
    S = sys.stdin.readline().rstrip()
    stack = []

    for i in range(len(S)):
        if len(stack) == 0:
            stack.append(S[i])
            continue
        if len(stack) > 2:
            if "".join(stack[len(stack)-3:len(stack)]) == "PPA" and S[i] == "P":
                stack.pop()
                stack.pop()
                stack.pop()
                
        stack.append(S[i])


    if (len(stack) == 0 or (len(stack) == 1 and stack[0] == 'P')):
        print("PPAP")
    else:
        print("NP")

#해설

마지막 100퍼에서 P도 PPAP 문자열이라 PPAP를 출력 해야하는데 안해서 틀려버렸다.

    for i in range(len(S)):
        if len(stack) == 0:
            stack.append(S[i])
            continue
        if len(stack) > 2:
            if "".join(stack[len(stack)-3:len(stack)]) == "PPA" and S[i] == "P":
                stack.pop()
                stack.pop()
                stack.pop()

        stack.append(S[i])

이런 문자열을 다뤄야 하는 애들은 stack으로 처리를 했다.

문자열을 받는데 0번째 자리에 들어가는 문자라면 아무 조건 없이 넣어주고( 여기서는 ppap 4글자이므로 4글자 이하는 그냥 넣어줘도 될듯 싶다) 안에 있는 값이 3자리(들어갈 수 1자리 해서 ppap인 4자리)이상일 경우 체크를 해주는데 맨뒤 글자 3개를 추출해서 PPA이고 현재값이 P라면 PPAP로 완성이므로 나머지 3개를 넣어주고 조건과 상관없이 문자가 들어가야 하므로 조건문 밖에서 문자를 넣어주었다.

    if (len(stack) == 0 or (len(stack) == 1 and stack[0] == 'P')):
        print("PPAP")
    else:
        print("NP")

이후 남은 스택의 길이가 0이거나 길이가 1인데 안에 값이 P일 경우 PPAP 문자열이므로 PPAP를 출력해주었고

아닐 경우 NP를 출력했다.