본문 바로가기

백준15815 - 천재 수학자 성필 (스택) Python 본문

개발/algorithm

백준15815 - 천재 수학자 성필 (스택) Python

자전하는명왕성 2023. 11. 11. 09:59
반응형

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

해당 문제는 '후위 표기식'을 연산하는 문제다.

 

문제에서 말하는 설명을 이해하면 후위 표기식은 우선 순위에 따라 이미 정렬된 문자열을 다루는 것이기 때문에

abc*+ 의 경우, b * c 를 먼저 처리한 뒤 a + (b * c)를 하여 값을 연산한다고 볼 수 있다.

 

그리고 이는 스택으로 풀이가 가능한데, 빈 스택에 연산자가 들어오기 전까지 스택에 정수를 추가하다가,

연산자가 들어올 경우 스택 마지막에 위치한 두 정수를 꺼내 연산한 뒤 다시 스택에 넣어주는 과정을 반복하는 방식으로 풀이가 가능하다.

 

문제 풀이 방식

import sys
data_temp = sys.stdin if sys.platform == 'linux' else open('입력.txt', 'r')
input_data = data_temp.read().rstrip()

def solution (data) :
  stack = []
  
  # 반복문 내에서 if문을 사용하는 방식대신, 딕셔너리에 함수를 저장하여 처리
  table = {
    ('+') : lambda x,y : x + y,
    ('-') : lambda x,y : x - y,
    ('*') : lambda x,y : x * y,
    ('/') : lambda x,y : x // y
  }

  for v in data :
    if v.isdigit() :
      stack.append(int(v))
    else :
      a,b = stack.pop(),stack.pop()
      stack.append(table[v](b,a))

  print(stack[0])

solution(input_data)
반응형
Comments