본문 바로가기

알고리즘 삽질장

[BOJ] 1918번 - 후위 표기식

반응형


문제설명

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

 

1918번: 후위 표기식

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

www.acmicpc.net

사고과정

  • 스택에 무엇을 넣어야 할지 매우 고민했다. 괄호만? 연산만? 문자열도? 결국 괄호랑 연산을 하나의 스택에, 문자열을 또 하나의 스택에 넣으려고 했다. 나름 풀려고 노력했지만 못 풀었다..
  • 다른 분의 풀이를 보니 괄호, 연산을 하나의 스택에 넣는 건 맞았지만 문자열은 그냥 바로 결과값에 붙이면 되었다.
  • 해당 문제를 풀이하는 과정을 단계화해보면 아래와같다.
  • 1. 스택에는 무엇을 넣을 것인가? 괄호와 연산을 넣었다. 괄호는 스택에서 어느 범위까지 연산을 pop해서 이어 붙일 것인지 위함이고 연산은 연산 간의 우선순위가 있기 때문에 스택에 넣었다.
  • 2. 곱하기, 나누기는 가장 우선하는 연산이다. 따라서 현재 곱하기 또는 나누기 연산을 마주쳤을 때, 이미 스택에 존재하고 있는 또 다른 곱하기 또는 나누기 연산이 나올 때까지 pop해서 결과값에 이어 붙인다.
  • 3. 더하기, 빼기는 가장 하위의 순위 연산이기 때문에 스택에 열린 소괄호가 마지막 원소가 아니라면 모두 pop해서 이어 붙인다.
  • 4. 닫힌 괄호가 문자열로 등장하면, 스택에서 열린 괄호가 마지막 원소가 될 때까지 모두 pop해서 이어 붙인다. 그리고 스택에서 남은 열린 괄호를 없애기 위해 pop해서 날려버린다.
  • 5. 문자열을 모두 돈 후, 스택에 남은 연산기호들을 결과값에 마저 이어 붙인다.

풀이(스스로 못 푼 풀이)

import sys

input = sys.stdin.readline
string = input().rstrip()

stack = []  # 스택에는 괄호와 연산 기호를 넣는다
result = ''  # 후위 표기식 결과

for s in string:
    if s.isalpha():
        result += s
    else:
        if s == '(':
            stack.append(s)
        elif s == '*' or s == '/':
            # 스택에서 마지막 원소가 스택에 이미 있던 *, /가 나오면 계속 pop해서 결과에 붙이기 -> stack[-1] != '(' 로 or 조건 붙이면 +,- 인 경우도 붙여버리므로 안 됨!
            while (stack and stack[-1] != '(') and (stack[-1] == '*' or stack[-1] == '/'):
                result += stack.pop()
            # 지금 마주친 * 또는 / 연산 기호 스택에 넣기
            stack.append(s)
        elif s == '+' or s == '-':
            # 스택에서 마지막 원소가 ( 열린괄호일 때까지 계속 pop해서 결과값에 붙이기( +, -는 가장 낮은 연산순위이기 떄문)
            while stack and stack[-1] != '(':
                result += stack.pop()
            # 지금 마주친 + 또는 - 연산 기호 스택에 넣기
            stack.append(s)
        elif s == ')':
            while stack and stack[-1] != '(':
                result += stack.pop()
            # 스택에 있던 ( 열린괄호 날리기
            stack.pop()

# 스택에 남아있는 모든 연산 기호 결과값에 붙이기
while stack:
    result += stack.pop()

print(result)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[BOJ] 10808번 - 알파벳 개수  (0) 2021.10.26
[BOJ] 1935번 - 후위 표기식2  (0) 2021.10.26
[BOJ] 17299번 - 오등큰수  (0) 2021.10.25
[BOJ] 17298번 - 오큰수  (0) 2021.10.25
[BOJ] 10799번 - 쇠막대기  (0) 2021.10.25