Baekjoon

[BOJ / 백준] 3425번 고스택 파이썬(Python) 문제 풀이

728x90

 

문제

 

문제 링크 : https://www.acmicpc.net/problem/3425

 

3425번: 고스택

각각의 입력값에 대해서, 해당하는 프로그램을 수행한 뒤, 출력값을 출력하면 된다. 출력값이란 스택에 저장되어 있는 숫자이다. 만약, 프로그램 에러가 발생하거나, 모든 수행이 종료됐을 때

www.acmicpc.net

 

 

 

 

 

CODE

import sys

input = sys.stdin.readline

def exec(commands, num):
    stack = [num]
    for cmd in commands:
        if cmd[:3] == "NUM":
            n = int(cmd[4:])
            stack.append(n)
        elif not stack:
            return "ERROR"
        elif cmd == "POP":
            stack.pop()
        elif cmd == "INV":
            stack[-1] *= -1
        elif cmd == "DUP":
            stack.append(stack[-1])
        elif len(stack) == 1:
            return "ERROR"
        elif cmd == "SWP":
            stack[-1], stack[-2] = stack[-2], stack[-1]
        elif cmd == "ADD":
            temp = stack.pop() + stack.pop()
            if abs(temp) > 10 ** 9:
                return "ERROR"
            stack.append(temp)
        elif cmd == "SUB":
            temp = -stack.pop() + stack.pop()
            if abs(temp) > 10 ** 9:
                return "ERROR"
            stack.append(temp)
        elif cmd == "MUL":
            temp = stack.pop() * stack.pop()
            if abs(temp) > 10 ** 9:
                return "ERROR"
            stack.append(temp)
        elif cmd == "DIV":
            a, b = stack.pop(), stack.pop()
            if a == 0:
                return "ERROR"
            temp = abs(b) // abs(a)
            if (a > 0 and b < 0) or (a < 0 and b > 0):
                temp = -temp
            if abs(temp) > 10 ** 9:
                return "ERROR"
            stack.append(temp)
        elif cmd == "MOD":
            a, b = stack.pop(), stack.pop()
            if a == 0:
                return "ERROR"
            temp = abs(b) % abs(a)
            if b < 0:
                temp = -temp
            if abs(temp) > 10 ** 9:
                return "ERROR"
            stack.append(temp)
        else:
            return "ERROR"

    if len(stack) == 1:
        return stack[0]
    return 'ERROR'


while True:
    commands = []
    while True:
        cmd = input().strip()
        if cmd == "QUIT":
            quit()
        if cmd == "END":
            break
        commands.append(cmd)

    n = int(input())
    for _ in range(n):
        num = int(input())
        print(exec(commands, num))
    print()
    input()  # 줄바꿈 삭제

 

 

 

 

 

 

풀이

💡 idea

- 명령어를 반복해야 하므로 commands 리스트에 명령어 저장

- 명령어 리스트와 입력값을 함수로 넘겨 명령어 실행!

- 명령어를 처리하는 함수 exec(commands, num)

 

 

💡 implementation

cmd에 따라 명령어를 처리하는 if문들 사이에

필요한 만큼의 스택 원소 수가 없다면 "ERROR"를 리턴하도록 elif 문을 삽입하였다

NUM은 필요하지 않고, POP, INV, DUP는 원소가 1개, SWP, ADD, SUB, MUL, DIV, MOD는 원소가 2개가 필요하다

 

        elif cmd == "SWP":
            stack[-1], stack[-2] = stack[-2], stack[-1]

파이썬은 swap하기 참 간단하네요 🥴

아직 이 편리함에 적응이 안돼서 swap 기본 제공이려나~~하고 찾아봤는데 이렇게 간단하게 처리가 가능하다니..ㅋㅋ

 

 

오타 때문에 계속 틀려서 한참을 고생했습니다 😭😭

알파벳 하나 때문에 시간을 얼마나 잡아 먹은건지...

그래도 초반 코드에서 오타를 고친 건 184ms인데, 시간 줄인 거라도 잘한 거라고 생각하기로😤

 

 

 

 

 

결과

 

 

 

 

 

 

 

728x90