데이터 엔지니어

백준 - [Gold 4] 1918번 후위 표기식 본문

프로그래밍(Programming)/알고리즘(Algorithm)

백준 - [Gold 4] 1918번 후위 표기식

kingsmo 2020. 9. 17. 22:35

문제링크: www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식��

www.acmicpc.net


문제 설명

- 중위표현식의 string이 주어짐.

- 중위 표현식을 후위 표현식으로 변환

ex)

- a+b -> ab+

- a+b*c => (a+(b*c)) =>  bc*a+

- A+B*C-D/E => ((A+(B*C))-(D/E)) -> ABC*+DE/-

 

위와 같이 변경해 주는 것입니다. 잘못된 입력은 주어지지 않고

알파벳 대문자와 +, -, *, /, (, ) 로만 이루어진다고 문제에 명시되어있습니다.


풀이

Stack을 활용한 문제입니다. 조건을 잘 따져주면 되는 문제입니다.

1. "(" 여는 괄호는 스택에 쌓아놓기

2. ")" 닫힌 괄호면 "("과 나올 때까지 출력하기 

3. 연산자면 스택에 있는 연산자가 우선순위가 높거나 같으면 출력하기 + 마지막에 스택에 현재 연산자 추가(주의)

4. 문자면 바로 출력

 

위와 같은 규칙에 따라 코드를 짜주면 됩니다.

 

코드

import sys
from sys import stdin
from collections import deque

stdin = open("input.txt", "r")
stack = deque()

operator = ['+', '-', '*', '/']

priority = {
    "*": 2, "/": 2,
    "+": 1, "-": 1,
    "(": 0
}
# 중위 표현식 입력
infix = stdin.readline().strip()

answer = ""
for char in infix:
    # 여는 괄호면 stack에 쌓아놓기
    if char == "(":
        stack.append(char)
    # 닫는 괄호면 여는 괄호가 나올 때까지 팝하기
    elif char == ")":
        while stack and stack[-1] != "(":
            answer += stack.pop()
        stack.pop()
    # 연산자면 스택 내부 살피기
    # 우선순위를 봐서 높거나 같으면 출력
    elif char in operator:
        while stack and priority[char] <= priority[stack[-1]]:
            answer += stack.pop()
        stack.append(char)
    # 문자면 바로출력
    else:
        answer += char

# 나머지 팝
while stack:
    answer += stack.pop()

print(answer)

 

Comments