문제

[BaekJoon] 1935 후위표기식2


풀이

후위표기식을 입력받고 표기식에 있는 알파벳을 그에 대응하는 입력한 숫자로 바로 바꿔주고 문제를 풀어나갈 생각이었다. 하지만 표기식의 index와 피연산자들의 index도 맞지 않는 등 잘 풀리지가 않았다.

그래서 ord() 를 활용해 word의 유니코드 정수에서 ‘A’의 유니코드 정수를 빼주어 ‘A’~’Z’ 까지의 문자를 0에서 25까지 범위로 매핑하고,

뺀 값의 인덱스를 검색하여 stack에 추가하는 식으로 풀었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys

n = int(sys.stdin.readline()) # 피연산자 갯수
expression = sys.stdin.readline() # 후위표기식
num = [int(sys.stdin.readline()) for _ in range(n)]

stack = []
for word in expression:
    if word.isalpha():
        stack.append(num[ord(word) - ord('A')])
    else:
        num2 = stack.pop()
        num1 = stack.pop()

        if word == '+':
            stack.append(num1 + num2)
        elif word == '-':
            stack.append(num1 - num2)
        elif word == '*':
            stack.append(num1 * num2)
        elif word == '/':
            stack.append(num1 / num2)

print('%.2f' % stack[0])

결과는 IndexError : pop from empty list..

num1 = stack.pop() 에서 stack이 비어있다는 오류가 발생한 것이었다.

어디가 잘못됐는지 한참을 찾아보고 수정해봤는데 한참동안을 헤멨다. 도저히 잘못된 게 없는 것 같은데,,

그러다 혹~시나 해서 sys.stdin.readline() 을 전부 input() 으로 변경했더니 어라..? 에러 해결.. strip() 를 까먹은 것이었다.

sys.stdin.readline() 입력은 개행 문자(\n)를 포함해 문자열을 읽고 input() 입력은 개행 문자를 자동으로 제거한다.

아마도 개행 문자를 포함해 문자열을 읽기 때문에 표기식 문자를 처리할 때 예상치 못한 에러가 발생한 것 같다..

그래서 sys.stdin.readline() -> sys.stdin.readline().strip() 변경해주고 제출해주니 정답.. 거의 한 시간을 넘게 쓴 나는 바보다..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys

n = int(sys.stdin.readline().strip()) # 피연산자 갯수
expression = sys.stdin.readline().strip() # 후위표기식
num = [int(sys.stdin.readline()) for _ in range(n)]

stack = []
for word in expression:
    if word.isalpha():
        stack.append(num[ord(word) - ord('A')])
    else:
        num2 = stack.pop()
        num1 = stack.pop()

        if word == '+':
            stack.append(num1 + num2)
        elif word == '-':
            stack.append(num1 - num2)
        elif word == '*':
            stack.append(num1 * num2)
        elif word == '/':
            stack.append(num1 / num2)

print('%.2f' % stack[0])

Leave a comment