후위 표기식
중위표기식이 입력되면 후위표기식으로 변환하는 프로그램을 작성하세요.
중위표기식은 우리가 흔히 쓰은 표현식입니다.
즉 3+5 와 같이 연산자가 피연산자 사이에 있 으면 중위표기식입니다.
후위표기식은 35+ 와 같이 연산자가 피연산자 뒤에 있는 표기식입니다.
예를 들어 중위표기식이 3+5*2 를 후위표기식으로 표현하면 352*+ 로 표현됩니다.
만약 다음과 같이 연산 최우선인 괄호가 표현된 식이라면
(3+5)*2 이면 35+2* 로 바꾸어야 합니다.
※후위 표기식이 이해가 안되면 구글링으로 공부해보는 것도 좋습니다.
▣ 입력설명
첫 줄에 중위표기식이 주어진다. 길이는 100을 넘지 않는다. 식은 1~9의 숫자와 +, -, *, /, (, ) 연산자로만 이루어진다.
▣ 출력설명 후위표기식을 출력한다.
▣ 입력예제 1
3+5*2/(7-2)
▣ 출력예제 1
352*72-/+
▣ 입력예제 2
3*(5+2)-9
▣ 출력예제 2
352+*9-
나의 코드
arr=input()
res=[]
stack=[]
for x in arr:
if x.isdecimal():
res.append(x)
elif x == '+' or x == '-':
if stack and stack[-1]!='(':
res.append(stack.pop())
stack.append(x)
elif x == '*' or x =='/':
if stack :
if stack[-1]=='*' or stack[-1]=='/':
res.append(stack.pop())
stack.append(x)
elif x=='(':
stack.append(x)
elif x==')':
while True:
if stack[-1] =='(':
stack.pop()
break
else:
res.append(stack.pop())
while stack:
res.append(stack.pop())
answer=''.join(map(str,res))
print(answer)
꼼꼼히 고민해서 코드를 잘 짠것같다.
우선 입력 값을 받은 후 해당 값이
1. 숫자이면 바로 res에 넣었다.
2. +,-이면 stack이 있으면서 stack의 가장 윗 값이 '(' 가 아니면 바로 그 윗값을 res에 넣었다
(+,-는 모든 우선 순위가 가장 끝이므로 스택에 있는 부호를 무조건 pop )
( '(' 조건 체크는 모든 코드를 거의 작성한 후 디버깅 하며 발견)
3. *,/ 인 경우 스택의 바로 뒤의 값이 /,*인 경우( 같은 우선순위이지만 먼저나온값은 먼저 계산해야함)
4. ( 인 경우 )를 만날 때 까지 괄호 사이 값들을 저장하는 포인터 역활을 위해 바로 stack에 넣는다.
5. ) 인 경우 (를 만날 때까지 스택의 값들을 pop
6. 마지막으로 스택이 빌때 까지 반복문을 돌며 스택에 있는 값들을 순서대로 pop 하여 res에 넣는다.
정답 코드
import sys
sys.stdin=open("input.txt", "r")
a=input()
stack=[]
res=''
for x in a:
if x.isdecimal():
res+=x
else:
if x=='(':
stack.append(x)
elif x=='*' or x=='/':
while stack and (stack[-1]=='*' or stack[-1]=='/'):
res+=stack.pop()
stack.append(x)
elif x=='+' or x=='-':
while stack and stack[-1]!='(':
res+=stack.pop()
stack.append(x)
elif x==')':
while stack and stack[-1]!='(':
res+=stack.pop()
stack.pop()
while stack:
res+=stack.pop()
print(res)
나의 코드와 동일하다 !
'코딩테스트[파이썬] > 알고리즘 문제풀이 입문' 카테고리의 다른 글
[스택 & 큐] -공주 구하기 (1) | 2024.02.09 |
---|---|
[스택 & 큐] - 후위식 연산 (0) | 2024.02.09 |
[스택&큐] - 쇠막대기 (0) | 2024.02.08 |
[스택&큐] - 가장큰수 (0) | 2024.02.08 |
[이진탐색- 역수열(그리디) *손도 못댐* (2) | 2024.02.08 |