본문 바로가기

알고리즘/🥇 골드

백준 1918 후위 표기식 파이썬 풀이

728x90

난이도 : 골드2

풀이일 : 03057

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

 

1918번: 후위 표기식

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

www.acmicpc.net


링크로 이동하기 귀찮은 분들을 위한 문제 캡쳐


1차 시도 오답

import sys
w = sys.stdin.readline()

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

print(result)

비슷하게 수정하면서 여러번 제출 했는데 세 번이나 틀렸다.


최종 정답

import sys

w = sys.stdin.readline().strip()

result = ''
stack = []
for i in w:
    if i in '+-*/()':
        if i == '(':      # 우선순위 최우선 무조건 삽입 
            stack.append(i)
        elif i == ')':    # 여는 괄호가 나올때까지 스택의 모든 요소 빼냄 
            while stack and stack[-1] != '(':
                result += stack.pop()
            stack.pop()
        elif i in '+-':   # 우선순위 최하위, 앞에 있는 사칙 연산 모두 빼냄 
            while stack and stack[-1] in '+-*/':
                result += stack.pop()
            stack.append(i)
        elif i in '*/':   # 우선 순위 중간, 앞에있는 */ 빼냄 
            while stack and stack[-1] in '*/':
                result += stack.pop()
            stack.append(i)
    else:
        result += i
while stack:              # 남아있는 요소는 모두 꺼냄 
    result += stack.pop()

print(result)

화가 나서 싹 지우고 조건을 생각한 다음에 다시 짜고 제출했더니 맞았다.


느낀점

문제 자체는 어렵지 않은 문제인데, 쉬워보여서 그런지 일단 코드를 쳤다가 여러번 틀렸다.

조건 꼼꼼히 생각하고 하나씩 풀어야지.

SWEA에서 비슷한 문제를 풀었어서 쉽게 느껴졌다. 세 번 틀리고 할 말은 아니지만