파이썬 알고리즘 035 | 후위식 연산

Yunny.Log ·2021년 1월 13일
0

Algorithm

목록 보기
35/318
post-thumbnail

35. 후위식 연산

후위연산식이 주어지면 연산한 결과를 출력하는 프로그램을 작성하세요.
만약 3(5+2)-9 을 후위연산식으로 표현하면 352+9- 로 표현되며 그 결과는 21입니다.
▣ 입력설명
첫 줄에 후위연산식이 주어집니다. 연산식의 길이는 50을 넘지 않습니다.
식은 1~9의 숫자와 +, -, , /, (, ) 연산자로만 이루어진다.
▣ 출력설명
연산한 결과를 출력합니다.
▣ 입력예제 1
352+
9-
▣ 출력예제 1
12

<내 풀이> - 실패

  • 일단 숫자들은 다 stack에 넣어주다가
    연산자가 나오면 stack에 있던 stack[-1]이랑 stack[-2] 를 pop해서
    연산자로 계산해주고 다시 stack에 append해주는 방식을 생각했는데
    pop하고 해당 연산자로 계산하는 방법을 지금 못 찾겠다
n=input()
stack=[]
res=[]
for i in range(len(n)) :
    if n[i].isdecimal()==False: 
        res.append(stack.pop(-1))
        res.append(n[i])
        res.append(stack.pop(-2))
        for i in res:       #이 res에서 [2, '+', 3] 를 계산해주는 방법을 모르겠다

        stack.append(res[0])
    else :
#숫자 만나면 무조건 stack으로
        stack.append(int(n[i])) #int도 다 잘 처리해줌
  • 선생님 설명 듣고 구현한 풀이=> 연산자인 경우 경우 4가지 뿐이니 나누면 된다
n=input()
stack=[]

for i in range(len(n)) :
    if n[i].isdecimal()==False:
        if n[i]=='+' :
            k=stack.pop(-2) + stack.pop(-1)
        elif n[i]=='-' :
            k=stack.pop(-2) - stack.pop(-1)
        elif n[i]=='*' :
            k=stack.pop(-2) * stack.pop(-1)
        elif n[i]=='/' :
            k=stack.pop(-2) / stack.pop(-1)
        stack.append(k)
    else :
        stack.append(int(n[i]))
print(stack[0])

<풀이>

  • 선생님은 따로 계산하는 거를 어떻게 처리해서 다시 stack에 넣었는가
    ===> 헉 그냥 연산자의 경우를 따로따로 다 나누면 된다

n=input()
stack=[]

for i in range(len(n)) :
    if n[i].isdecimal()==False:
        if n[i]=='+' :
            n1=stack.pop()
            n2=stack.pop()
            stack.append(n2+n1)
        elif n[i]=='-' :
            n1=stack.pop()
            n2=stack.pop()
            stack.append(n2-n1)           
        elif n[i]=='*' :
            n1=stack.pop()
            n2=stack.pop()
            stack.append(n2*n1)           
        elif n[i]=='/' :
            n1=stack.pop()
            n2=stack.pop()
            stack.append(n2/n1)            
    else :
        stack.append(int(n[i]))
print(stack[0])

<반성점>

  • pop(-2) pop(-1) 말고도 먼저 pop()으로 두번하고 이 두번을 각각 변수에 저장해서 사용하는 것이 더 바람직하다
  • 그리고 왼쪽 숫자 - 오른쪽 숫자이므로 순서도 중요하다'
    먼저 pop한 애가 n1이고 두번째 pop한 애가 n2라면 무조건 n2-n1 순서로 가야한다, 나는 역으로 계산할 뻔

<배운 점>

  • 경우의 수를 나눠서 하는 것
  • 또 문자열을 계산해주는 함수도 있다 eval()
    =>문자열로 된 수식을 계산해주는 함수인데 이번 문제와 같이 괄호 없이 그때 그때 계산하는 경우라면 사용
    (ex)
    eval("1+2") 라는 문자열이 매개변수로 들어오면
    출력 값으로 3이라는 값을 반환
    => eval 함수로 문제 해결하신 다른 분의 풀이

lst=input()
stk=[]
res=''
for i in lst:
    if i.isdecimal():
        stk.append(i)
    else:
        res=eval(stk.pop(-2)+i+stk.pop())
        stk.append(str(res))
print(res)

0개의 댓글