KEEP GOING

[python] 백준 1935번 : 후위 표기식2 본문

code review/stack-queue

[python] 백준 1935번 : 후위 표기식2

jmHan 2022. 1. 27. 16:29
반응형

 

 

 

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])
반응형
Comments