문제
중위표기식이 입력되면 후위표기식으로 변환하는 프로그램을 작성하세요. 중위표기식은 우리가 흔히 쓰은 표현식입니다. 즉 3+5 와 같이 연산자가 피연산자 사이에 있으면 중위표기식입니다. 후위표기식은 35+ 와 같이 연산자가 피연산자 뒤에 있는 표기식입니다. 예를 들어 중위표기식이 3+52 를 후위표기식으로 표현하면 352+ 로 표현됩니다. 만약 다음과 같이 연산 최우선인 괄호가 표현된 식이라면 (3+5)2 이면 35+2 로 바꾸어야 합니다.
입력 설명
첫 줄에 중위표기식이 주어진다. 길이는 100을 넘지 않는다. 식은 1~9의 숫자와 +, -, *, /, (, ) 연산자로만 이루어진다.
출력 설명
후위표기식을 출력한다.
입력예제 1
3+5*2/(7-2)
출력예제 1
352*72-/+
문제 풀이
import sys
sys.stdin = open("in5.txt", "rt")
data = list(input())
oper = []
for i in range(len(data)):
chr = data[i]
if chr.isdigit():
print(chr,end="")
else:
if oper:
while True and oper:
if (oper[-1] == "*" or oper[-1] == "/") and (chr != "(" and chr!=")"):
print(oper.pop(),end="")
else:
break
while True and oper:
if (chr == "+" or chr == "-") and (oper[-1] == "+" or oper[-1] == "-"):
print(oper.pop(), end="")
else:
break
if chr == ")":
while True:
c = oper.pop()
if c == "(":
break
else:
print(c,end="")
else:
oper.append(chr)
else:
oper.append(chr)
while oper:
print(oper.pop())
입력된 값이 숫자이면 바로 출력을 합니다. 그 외의 경우는 stack이라는 변수에 넣어서 해당 변수의 마지막 값이 stack에 넣을려고 하는 값보다 우선순위가 높으면 stack에서 그 값을 다 꺼내고 마지막에 넣을려고 하는 값을 넣습니다. 입력된 값이 ")"일 경우 "(" 만날때까지 stack에 있는 값을 꺼내서 출력합니다. 여기서 우선순위는 ")" > "*", "/" > "+", "-" 순이며 왼쪽이 오른쪽 연산자보다 우선순위가 더 높습니다.
반응형
'알고리즘' 카테고리의 다른 글
| [인프런] 뮤직비디오(이분탐색 알고리즘) - 파이썬 (0) | 2022.06.03 |
|---|---|
| 다익스트라(dijkstra) 알고리즘 (0) | 2021.12.23 |
| 동적계획법(Dynamic Programming) (0) | 2021.12.20 |
| 병합 정렬(Merge Sort) (0) | 2021.12.14 |
