본문 바로가기
SW 정글사관학교/니약점 알고리즘

[백준/Python] 16120 - PPAP

by baebang 2023. 3. 16.

문제

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를 출력한다.

걍 쉽게 말해서 PPAP가 감지되면 4글자를 "P"로 바꿔서

전체 배열이 PPAP가 되면 PPAP출력 아니면 NP출력 이다. 

아래는 내가 짠 코드

import sys 

ppap = list(map(str,sys.stdin.readline().strip()))
check = ['P', 'P', 'A', 'P']
result_arr = []


for i in range(0,len(ppap)):
    result_arr.append(ppap[i])
    #하나씩 result 스택에 담아둔다
    if len(result_arr) >=4:
    #스택이 4개 이상이 되었을때
        if result_arr[-4:] == check:
        # 담겨진 스택이 PPAP가 되었는지 확인하고
            for _ in range(3):
                result_arr.pop()
                #PPAP가 되었다면 P를 남겨두고 "PAP"만을 삭제한다.
#이런식으로 4개 이상을 유지하면서 새로 들어오는 값이 기존에 있는값과
#합체 하였을때 PPAP인지를 확인하자
        
if result_arr == ['P']:
#PPAP가 될 아이였다면 P하나만 남게되므로 PPAP출력
    print("PPAP")
else: print("NP")
#아니면 반환

당연하게 del을 쓰면 시간초과가 난다 del 의 시간 복잡도는 O(n) 이기 때문 (시간 복잡도 참고블로그)

그래서 del 대신 pop을 썻는대도 시간초과가 나왔다 찾아보니 pop(n) = O(n)임;;

걍 싹 지우기 좋게 만들어놓고 (스택)pop하는 수밖에

 

 

 

 

 

댓글