Coding Test/baekjoon
[백준 1918] 후위 표기식- python (solved.ac - 골드 2)
조용장
2022. 6. 6. 17:35
https://www.acmicpc.net/problem/1918
1918번: 후위 표기식
첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 알파벳 대문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의
www.acmicpc.net
풀이
문제를 보았을때 알수있는 힌트
후위 표기식을 생각하면서 조건을 어떻게 짜야하는지 고민하며 문제를 풀면 쉽게 풀 수 있다.
1. 알파벳과 표기식이 나오는 경우를 나눈다.
- 알파벳이 나오는 경우 결과 리스트에 추가한다.
- 표기식이 나오는 경우 아래에 조건을 따른다.
2. 표기식이 나온경우 조건식
- 시작하는 괄호가 나오는 경우 : 스택에 쌓아준다.
- "+"나"-" 가 나오는 경우 : 스택에 쌓인 값을 꺼내준다. 단 시작하는 괄호가 나오면 거기서 멈춘다. 이후 현재 나온 "+"나"-" 을 스택에 쌓는다.
- "*"나"/"가 나오는 경우 : 스택에 쌓인 값을 꺼내준다. 단, "*" 나 "/" 인 경우에만 꺼내준다.
- 닫는 괄호가 나오는 경우 : 시작하는 괄호까지 스택을 꺼내주고 시작하는 괄호또 꺼내준다.
3. 스택이 남은 경우 결과 리스트에 스택을 쌓아 준다.
이 조건을 만족하게 코드를 짜면 틀리지 않고 맞을 것이다.
import sys
input = sys.stdin.readline
n = list(input().strip())
n_list =["+","-","*","/","(",")"]
stack=[]
result =[]
while n:
v=n.pop(0)
if v in n_list:
# 여기서 조건을 걸어야함.
if v=="(":
stack.append(v)
elif v=="+" or v=="-":
while len(stack)!=0 and stack[-1]!="(":
result.append(stack.pop(-1))
stack.append(v)
elif v=="*" or v=="/":
while len(stack)!=0 and (stack[-1] == '*' or stack[-1] =='/'):
result.append(stack.pop(-1))
stack.append(v)
elif v==")":
while len(stack)!=0 and stack[-1]!="(":
result.append(stack.pop(-1))
stack.pop(-1)
else:
result.append(v)
while stack:
result.append(stack.pop(-1))
print("".join(result))
https://github.com/dydwkd486/coding_test/blob/main/baekjoon/baekjoon1918.py