꾸준히 안타치기
1935. 후위 표기식2 (stack) 본문
문제
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
https://www.acmicpc.net/problem/1935
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
예제 입력 1
5
ABC*+DE/-
1
2
3
4
5
예제 출력 1
6.20
💡 이 문제를 보고 내가 생각한 것들, 생각한 순서
테스트 케이스입력 받기
후위표기식 입력받기
알파벳에 대응하는 숫자를 스택에 넣기
💡 어떤 자료구조를 택했고 그 이유는?
연산자를 만나면 앞의 두개를 꺼내어서 계산해야 하므로 맨뒤의 값을 뽑는 스택을 사용
💡 풀이
n = int(input()) # 테스트값 입력
word = input() #후위표기식문자열 통으로 입력받음
numList = [0] * n #숫자를 담을 리스트
for i in range(n): # 테스트값만큼 숫자를 받는다.
numList[i] = int(input())
stack = [] # 빈 리스트생성
for i in word: #후위표기식통문자열을 넣고 반복
if 'A' <= i <= 'Z': #알파벳을 만나면,알파벳이아니라 숫자를 저장한다.
stack.append(numList[ord(i) - ord('A')]) #⭐️numList의 순서에 따라 stack에 숫자를 넣는다는 의미이다.
else:# 숫자를 만나면 #stack 리스트의 마지막 2항목을 꺼내와서 계산한다.
n1 = stack.pop() #먼저뽑은값
n2 = stack.pop() #두번째뽑은값
if i == '+':
stack.append(n2 + n1) #먼저뽑은값이 뒤고(오른쪽), 나중에 뽑은값이 앞(왼쪽)
elif i == '-':
stack.append(n2 - n1)
elif i == '*':
stack.append(n2 * n1)
elif i == '/':
stack.append(n2 / n1)
print('%.2f' % stack[0])# '%.2f' % 함수를 통해 소수점 자릿수를 제한한다.
n = int(input())
word = input()
numList = [0] * n
for i in range(n):
numList[i] = int(input())
stack = []
for i in word:
if 'A' <= i <= 'Z':
stack.append(numList[ord(i) - ord('A')])
else:
n1 = stack.pop()
n2 = stack.pop()
if i == '+':
stack.append(n2 + n1)
elif i == '-':
stack.append(n2 - n1)
elif i == '*':
stack.append(n2 * n1)
elif i == '/':
stack.append(n2 / n1)
print('%.2f' % stack[0])
💡 문제에서 중요한 부분
Pythonhttps://animoto1.tistory.com/entry/백준-1935-후위-표기식2-파이썬-Python ⭐️참고
stack 리스트에 알파벳이 아니라 피연산자의 값으로 저장해야함
알파벳에 대응하는 숫자를 스택에 넣는것이 어렵다.
stack.append(numList[ord(i)-ord('A')])를 통해 stack 리스트에 알파벳이 아닌 피연산자값 저장하기.
stack.append(numList[ord(i) - ord('A')]) #⭐️ 어려운부분
ord는 유니코드값을 나타내는것 A와 Z사이에 있는것이면
A가 0, B가 1….. Z는 25이런식
리스트 (딕셔너리)의 키를 'A', 'B', ..., 'Z' 에서 0, 1, ..., 25 으로 변환하는 표현이다.
numList는 입력받는 값일뿐이고
stack.append(numList[ord(i)-ord('A')]) 의 뜻은
numList의 순서에 따라 stack에 숫자를 넣는다는 의미이다.
'CS > 백준' 카테고리의 다른 글
2525 -오븐시계 (0) | 2022.07.28 |
---|---|
14426. 접두사 찾기 💭 (list, startwith()함수사용) (0) | 2022.07.18 |
2476 - 주사위게임 / 2480 - 주사위 세개 (0) | 2022.07.14 |
2346 - 풍선 터뜨리기 💭 (0) | 2022.07.13 |
1835 - 카드(deque) 💭 (0) | 2022.07.12 |