IT recording...

[BOJ] 3425 고스택 - python 본문

Algorithm

[BOJ] 3425 고스택 - python

I-one 2021. 12. 2. 20:22

3425번: 고스택

 

3425번: 고스택

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

www.acmicpc.net

  • 푼 코드
  • 더보기
    import sys
    from collections import deque
    
    input = sys.stdin.readline
    
    def goStack(pList, num):
        goStack = deque([num])
        # 연산
        for pL in pList:
            if pL.split(" ")[0] == "NUM":  # 스택 최상위에 저장하기 0
                goStack.appendleft(int(pL.split(" ")[1]))
            elif not goStack:
                return "ERROR"
            elif pL == "POP":  # 스택 가장 위 숫자 제거하기 1
                goStack.popleft()
            elif pL == "INV":  # 첫 번째 수의 부호 바꾸기 1
                f = goStack.popleft()
                f = f * (-1)
                goStack.appendleft(f)
            elif pL == "DUP":  # 첫 번째 숫자를 하나 더 스택의 최상위에 저장하기 1
                goStack.appendleft(goStack[0])
            elif len(goStack) == 1:
                return "ERROR"
            elif pL == "SWP":  # 첫 번째 숫자와 두 번째 숫자 위치 바꾸기 2
                # tmp = goStack[0]
                # goStack[0] = goStack[1]
                # goStack[1] = tmp
                goStack[0],goStack[1] = goStack[1],goStack[0]
            elif pL == "ADD":  # 첫 번째 숫자와 두 번째 숫자 더하기 2
                result = int(goStack.popleft()) + int(goStack.popleft())
                if abs(result) > 10 ** 9:
                    return "ERROR"
                goStack.appendleft(result)
            elif pL == "SUB":  # 첫 번째 숫자와 두 번째 숫자 빼기  (두 - 첫) 2
                result = (-1)* int(goStack.popleft()) + int(goStack.popleft())
                if abs(result) > 10 ** 9:
                    return "ERROR"
                goStack.appendleft(result)
            elif pL == "MUL":  # 첫 번째 숫자와 두 번째 숫자 곱하기 2
                result = int(goStack.popleft()) * int(goStack.popleft())
                if abs(int(result)) > 10 ** 9:
                    return "ERROR"
                goStack.appendleft(result)
    
            elif pL == "DIV":  # 나눈 몫 저장  ex) 13 div -4 = -3 #음수가 한 개 일 경우만 몫이 음수 2
                f = int(goStack.popleft())
                s = int(goStack.popleft())
                if f == 0:
                    return "ERROR"
                result = divmod(abs(s), abs(f))[0]  # 몫
                if f * s < 0:
                    result = result * (-1)
                if abs(int(result)) > 10 ** 9:
                    return "ERROR"
                goStack.appendleft(result)
            elif pL == "MOD":  # 나눈 나머지 저장 ex) -13 mod 4 = -1, -13 mod -4 = -1 #나머지는 첫 수 부호 따라감 2
                f = int(goStack.popleft())
                s = int(goStack.popleft())
                if f == 0:
                    return "ERROR"
                result = divmod(abs(s), abs(f))[1]  # 나머지
                if s < 0:
                    result = result * (-1)
                if abs(int(result)) > 10 ** 9:
                    return "ERROR"
                goStack.appendleft(result)
            else:
                return "ERROR"
    
        if len(goStack) == 1:
            return goStack[0]
    
        return "ERROR"
    
    
    while True:
        programList = []
    
        while True:
            programTmp = input().strip()
            if programTmp == "QUIT":
                quit()  # 종료
            if programTmp == "END":
                break
            programList.append(programTmp)
    
        n = int(input())
        for _ in range(n):
            num = int(input())
            print(goStack(programList, num))
    
        print()
        input()  # 빈 줄 읽기

얻어가는 것

느낀점

"210903"

소요 시간 : 3h

  • 알고리즘 적으로 어려운 문제는 아니었지만 생각해야 할 예외들이 많아 쉽지 않은 문제였다.
  • 예상치 못한 런타임에러로 무엇이 오류의 원인인지 찾기가 매우 힘들었다. 런타임 오류가 발생했을 때 당황하지 않고 오류의 원인을 찾는 연습을 해야할 것 같다.
  • 입력받는 방법에서 개행문자를 신경써야 한다.
  • 문제의 조건을 잘 읽고 체크해놓자. (이항 연산자의 경우 연산 순서를 무시해서 틀림)

'Algorithm' 카테고리의 다른 글

[BOJ] 1713 후보 추천하기 - python  (0) 2021.12.02
[BOJ] 1932 정수 삼각형 - python  (0) 2021.12.02
[BOJ] 2098 외판원 순회 - python  (1) 2021.12.02
[BOJ] 1062 가르침 - python  (0) 2021.12.02
[BOJ] 3055 탈출 - python  (0) 2021.12.02
Comments