[python] 백준 1918번

hyeo71·2023년 5월 30일
0

백준

목록 보기
12/24

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

문제


소스코드

import sys


notation = sys.stdin.readline().rstrip()
stack = []
result = ""

for i in notation:
    if i.isupper():
        result += i
    else:
        if i == "(":
            stack.append(i)
        elif i == "*" or i == "/":
            while stack and (stack[-1] == "*" or stack[-1] == "/"):
                result += stack.pop()
            stack.append(i)
        elif i == "+" or i == "-":
            while stack and stack[-1] != "(":
                result += stack.pop()
            stack.append(i)
        elif i == ")":
            while stack and stack[-1] != "(":
                result += stack.pop()
            stack.pop()

print(result + "".join(stack)[::-1])

풀이

알파벳의 순서는 바뀌지 않고 사칙연산의 위치만 바뀌기 때문에 입력제한에 따라 대문자인지 판별하고 결과값에 추가한다.

  • 문자가 ( 일 경우 스택에 추가한다.
  • *, / 일 경우 이전에 저장된 우선순위가 같은 *, /을 결과에 추가하고 현재 문자를 스택에 추가한다.
  • +, - 일 경우 가장 낮은 우선순위를 가지지만 괄호( )에 의해 우선순위가 바뀔 수 있어 ( 을 기준으로 하여 위 작업과 동일하게 한다.
  • ) 일 경우 ( 을 기준으로 결과에 추가하고 사칙연산에서 괄호는 계산 후 사라지기 때문에 pop()을 통해 ( 을 제거한다.
  • 만들어진 결과값과 스택에 남은 값을 붙여 최종값을 출력한다.

0개의 댓글