문제 링크
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
계산 결과를 소숫점 둘째 자리까지 출력한다.
import sys
input = sys.stdin.readline
test_case = int(input())
sen = input().rstrip()
num_list = []
result_list = []
for _ in range(test_case):
num_list.append(int(input().rstrip()))
for alpha in sen :
if 'A' <= alpha <= 'Z' :
result_list.append(num_list[ord(alpha) - ord('A')])
else :
# 무조건 num2 먼저 빼기!!!
num2 = result_list.pop()
num1 = result_list.pop()
if alpha == '+' :
result_list.append(num1 + num2)
elif alpha == '-' :
result_list.append(num1 - num2)
elif alpha == '*' :
result_list.append(num1 * num2)
elif alpha == '/' :
result_list.append(num1 / num2)
# print(round(float(result_list[0]), 3))
print(format(result_list[0],".2f"))
import sys
input = sys.stdin.readline
test_case = int(input())
sen = input().rstrip()
num_list = []
result_list = []
테스트 케이스의 개수와 후위표기식을 받는다. 이때 숫자들을 저장할 리스트와 결과를 저장할 리스트도 함께 생성했다.
for _ in range(test_case):
num_list.append(int(input().rstrip()))
for alpha in sen :
if 'A' <= alpha <= 'Z' :
result_list.append(num_list[ord(alpha) - ord('A')])
else :
# 무조건 num2 먼저 빼기!!!
num2 = result_list.pop()
num1 = result_list.pop()
if alpha == '+' :
result_list.append(num1 + num2)
elif alpha == '-' :
result_list.append(num1 - num2)
elif alpha == '*' :
result_list.append(num1 * num2)
elif alpha == '/' :
result_list.append(num1 / num2)
test case만큼 for문을 실행해 num_list에 숫자를 삽입했다.
두 번째 for문은 위에서 저장한 문장을 알파벳일 경우에는 result_list에 저장하고, 연산자일 경우 result_list에 저정된 숫자를 pop하여 계산한다.
이때 알파벳일 경우 python의 ord를 이용해서 문자를 유니코드 정수로 변환하여 num_list에서 꺼내올 인덱스를 설정한다. 처음에는 같은 알파벳을 여러 번 사용할 경우나 알파벳 순서가 바뀐 경우를 생각하지 못해 num_list에서 숫자를 꺼내올 때 순서대로 꺼내와 계속하여 오답처리가 되었다. 이후 입력되는 후위연산식의 알파벳 순서가 오름차순이 아닐 수도 있다는 생각이 들어 수정하게 되었다.
연산자일 경우 num2를 먼저 pop하여 왼쪽 숫자에서 오른쪽 숫자를 연산할 수 있도록 하였다.
# print(round(float(result_list[0]), 3))
print(format(result_list[0],".2f"))
계산 이후에는 result_list에는 결과를 제외한 모든 숫자들이 pop되어 0번째 인덱스에 결과만 남으므로, 0번 인덱스를 출력한다. 이때, 소수 둘째 자리까지 출력해야 하므로 format을 사용한다. 처음에는 round를 사용하려 했으나, 정수일 경우 소수 첫째 자리까지 출력되므로 format을 사용하였다.
처음에는 이게 왜 스택 문제지? 라고 생각했지만,,, 후위표기법을 몰라서 생긴 일이었다. 내 멋대로 후위표기법을 AB+CD+일 경우 A+BC+D라고 생각하여 문제를 해결하지 못했지만 계산기로 계산해본 이후 잘못되었음을 인지하고 후위표기법을 공부한 이후에는 쉽게 풀이할 수 있었다.
좋은 정보 얻어갑니다, 감사합니다.