[Python][백준] 16120번 PPAP

신남·2023년 1월 31일

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

공부 날짜 : 2023.01.31
정답 참조 여부 : X

p가 ppap문자열이고 ppap문자열에서 p를 ppap로 바꾼 문자열도 ppap문자열일 때 주어진 문자열이 ppap문자열인지 판별하는 문제이다.


각 문자열을 순회하며 A가 나왔을때 스택에서 2번 pop하는데 pop가 안되면 NP, 문자열을 다 돌면 ppap로 먼저 로직을 짰다.

해당 방법은 PPAP에서 A는 추가되지 않고, 앞의 PP는 pop으로 나오며, 마지막 P는 추가되어서 PPAP문자열을 다시 P로 만드는 과정으로 생각하고 코드를 작성했다.

해당 코드의 문제는 PPPPPPPAA와 같이 A가 연달아 나왔을때 스택에서 2개의 P가 나올수 있어서 오류가 났다.

이걸 해결하기 위해 A가 나오면 check변수를 True로 바꾸고 다음 문자열에서 A이고 True이면 NP출력, P이면 check를 다시 False로 바꿔주고 반복했다.

또 이 코드의 문제점은 마지막이 A로 끝났을때 PPPPPPPA의 경우에는 마찬가지로 오류가났다.

그래서 마지막 출력직전에 check로 한번더 체크해서 마지막이 A였는지 판단했다.

하지만 또 발생한 문제는 PP의 경우는 PPAP문자열이 아니다. (P는 PPAP문자열이고, P를 PPAP로 만든 문자열은 PPAP문자열이지만, PPAP문자열끼리 이어 붙인건 PPAP문자열이 아니다!)

그래서 최종적으로 마지막 stack에 P만 남아있으면 PPAP문자열인걸로 수정해줘서 정답으로 나왔다.


어렵진 않았지만, 예외상황을 떠올리는게 어려웠던 문제였다. 옛날에는 예외상황을 떠올리기 위해 몇일이고 고민하고 생각하며 성장했는데 요즘은 질문게시판이나, 자료를 바로 찾아보는 버릇이 생겼다. 앞으로는 예외상황에 대해서 좀 더 고민해볼 필요를 느꼈다.

소스코드

import sys
input_ = sys.stdin.readline
##########################################
input_data = input_().rstrip()

stack = []

# 이전 값이 A인지 체크하는 변수
check = False
# 각 문자열로 체크
for char in input_data:
    if check and char == "A":
        print("NP")
        exit()

    # 문자열이 A이면
    if char == "A":
        # 앞의 PP를 빼옴
        try:
            a = stack.pop(-1)
            b = stack.pop(-1)

        # PP가 없으면 PPAP아님
        except IndexError:
            print("NP")
            exit()

        check = True
        continue

    # P는 추가 -> A가 나와서 PPAP가 하나의 P로 바뀜
    # PP는 빠지고 A는 추가 안함 뒤의 P가 추가됨
    check = False
    stack.append(char)

# 마지막이 A로 끝났으면 NP 아니면 PPAP
if check:
    print("NP")
elif stack == ["P"]:
    print("PPAP")
else:
    print("NP")

0개의 댓글