KEEP GOING
[python] 백준 1935번 : 후위 표기식2 본문
반응형
1. 코드 구현
n = int(input())
postfix = input()
operator = ['*', '-', '+', '/']
stack = []
numbers = dict()
for i in range(n):
number = input()
for data in postfix:
if data == chr(i+65):
numbers[data] = number
for data in postfix:
# data가 문자라면 ex A, B, C, D, ...
if data not in operator:
stack.append(data)
else:
w2 = stack.pop()
w1 = stack.pop()
if 'A' <= str(w2) <= 'Z':
w2 = numbers[w2]
if 'A' <= str(w1) <= 'Z':
w1 = numbers[w1]
result = eval(str(w1)+data+str(w2))
stack.append(result)
print("%.2f"%stack[0])
문자열이 들어왔을 때, stack에 그대로 저장해둔 뒤 문자열에 해당하는 숫자를 꺼내기 위해 numbers 딕셔너리를 생성하였다. A 문자에 해당하는 숫자로 1이 들어온다면 numbers['A']과 같은 방식으로 1에 접근할 수 있다. stack에 문자열만 넣는다고 생각했지만 결국 else문에서 eval 함수를 통해 도출된 정수값이 stack에 저장되기 때문에 if문을 사용하여 다시 'A' 를 1로 저장해야 했기에 효율적이지 못한 코드였다.
이 문제를 해결하기 위해 다른 사람들의 풀이를 보면서 코드를 개선해보았다.
2. 숏코딩 구현
n = int(input())
sentence = input()
stack = []
# 대문자에 대응하는 숫자를 담는 리스트
nums = [int(input()) for _ in range(n)]
for s in sentence:
# 'A' ~ 'Z' 사이의 대문자라면
if ord('A') <= ord(s) <= ord('Z'):
# 대문자에 대응하는 숫자 저장
number = nums[ord(s) - ord('A')]
stack.append(number)
continue
# 대문자가 아닌 연산자라면
w2 = stack.pop()
w1 = stack.pop()
result = eval(str(w1) + s + str(w2))
stack.append(result)
print("%.2f"%stack[0])
반응형
'code review > stack-queue' 카테고리의 다른 글
[python] 프로그래머스 : 기능개발 (stack, queue) (0) | 2022.02.18 |
---|---|
[python] 백준 2504번 : 괄호의 값 (stack) (0) | 2022.02.02 |
[python] 백준 2164번 : 카드2 (queue, 2*n-m 규칙 찾기) (0) | 2022.01.27 |
백준 11286번: 절댓값 힙(우선순위 큐) (0) | 2021.11.23 |
백준 11279번: 최대 힙(maxHeap) (0) | 2021.11.21 |
Comments