Algorithm & Problem Solving/자료구조(Data Structure)

[백준 1918] 후위 표기식 (Python) (중위 표기식 -> 후위 표기식 변환 문제)

baby_ohgu 2021. 10. 3. 15:57

https://www.acmicpc.net/problem/1918

 

1918번: 후위 표기식

첫째 줄에 중위 표기식이 주어진다. 단 이 수식의 피연산자는 A~Z의 문자로 이루어지며 수식에서 한 번씩만 등장한다. 그리고 -A+B와 같이 -가 가장 앞에 오거나 AB와 같이 *가 생략되는 등의 수식

www.acmicpc.net

 

문제풀이

 

cmd : 입력값

stack : 괄호와 연산자를 저장할 stack list

ans : 결과 list

 

스택을 이용해서 연산자의 우선순위를 결정해 결과 list에 넣는 방식으로 해결하였다.

 

1. A~Z 알파벳일 경우 ans에 바로 추가한다.

 

2. '(', '+', '-'. '*', '/' 연산자일 경우 stack에 추가한다.

- '*' 나 '/' 일 경우, 연산자 우선순위에 의해서 현재 stack에 추가로 '*', '/' 가 있는지 탐색 후 stack에 추가한다.

- '+' 나 '-' 일 경우, 연산자 우선순위에 의해서 현재 stack에 '(' 가 있는지 탐색 후 stack에 추가한다.

- ')' 의 경우, stack에서 '(' 탐색 후 stack 에서 '('를 빼준다.

 

3. stack에 남아있는 값을 ans에 추가한다.

 

코드

if __name__ == '__main__':
    cmd = input()
    stack, ans = [], []
    for ch in cmd:
        if 'A' <= ch <= 'Z':
            ans.append(ch)
        else:
            if ch == '(':
                stack.append(ch)
            elif ch == '*' or ch == '/':
                while stack and (stack[-1] == '*' or stack[-1] == '/'):
                    ans.append(stack.pop())
                stack.append(ch)
            elif ch == '+' or ch == '-' or ch == ')':
                while stack and stack[-1] != '(':
                    ans.append(stack.pop())
                if ch != ')':
                    stack.append(ch)
                else:
                    stack.pop()
    while stack:
        ans.append(stack.pop())
    print(''.join(map(str, ans)))

 

결과

 

문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!