[WEEK02] 정글시험 16120 PPAP

UBIN·2023년 4월 20일
0
post-custom-banner

문제

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가 연속해서 들어있다면 P로 바꿔주면 된다.
count라는 변수로 현재 상태를 바꿔가며 판단해주었다.
PP가 있다면 count = 2
count = 2인 상태에서 A가 들어온다면 count = 3
count = 3인 상태에서 P가 들어온다면 3개를 빼주고 P를 넣어준다.

전체코드

str_input = sys.stdin.readline().strip()
stack = []
count = 0

if str_input == 'P':
    print('PPAP')
    sys.exit()

if len(str_input) < 4:
    print('NP')
    sys.exit()

for ch in str_input:
    if stack and stack[-1] == 'P' and ch == 'P':
        count = 2 
        stack.append(ch)
        continue
    if stack and count == 2 and ch == 'A':
        count = 3
        stack.append(ch)
        continue
    if stack and count == 3 and ch == 'P':
        for _ in range(3):
            stack.pop()
        if stack and stack[-1] == 'P':
            count = 2
        else:
            count = 1
        stack.append(ch)
        continue

    stack.append(ch)

print('PPAP' if len(stack) == 1 else 'NP')

처음에는 길이 1인 P가 들어올 때의 경우를 고려하지 않아서 한참 해멨다.

profile
ubin
post-custom-banner

0개의 댓글