Algorithm Study/Python

[백준 파이썬] #1918. 후위표기식

728x90
반응형

풀기 전 생각해보기😮

  • stack 구조를 이용

풀이🛫

다른 분의 풀이를 참고했다

inp = list(input())
stack = []      # 스택 저장 공간
res = ""

# inp 값의 요소 확인
for i in inp:
    if i.isalpha():     # i.isalpha(): 만약 i가 영문자라면 True
        res += i        # res에 문자 입력

    elif i == '(':          # 여는 괄호: stack에 담는다
        stack.append(i)

    elif i == '*' or i == '/':      # 곱셈 또는 나눗셈
        # stack의 꼭대기 연산자가 같은 우선순위의 연산자일 경우
        while stack and (stack[-1] == '*' or stack[-1] == '/'):
            res += stack.pop()  # res에 모든 연산자를 입력하고
        stack.append(i)         # stack에 현재 연산자 입력

    elif i == '+' or i == '-':      # 덧셈 또는 뺄셈
        # stack의 꼭대기 연산자가 여는괄호가 아닌 동안
        while stack and stack[-1] != '(':
            res += stack.pop()  # res에 모든 연산자를 입력
        stack.append(i)         # stack에 현재 연산자 입력

    elif i == ')':          # 닫는 괄호일 때
        while stack and stack[-1] != '(':   # 여는 괄호가 나올 때 까지
            res += stack.pop()      # 연산자를 빼서 res에 입력
        stack.pop()     # 여는 괄호까지 제거

while stack:        # stack에 남은 값들에 대해서
    res += stack.pop()      # stack의 위에 쌓인 연산자부터 res에 입력

print(res)

 

핵심 정리🎁

  • for 문의 i값이 연산자일 경우 조건에 맞게 while문과 pop()을 진행한다

 

링크💎

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

 

1918번: 후위 표기식

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

www.acmicpc.net

 

후기 😎

어려웠던 점

  • 얼추 비슷하게 실행하는데 성공했지만, 괄호에 대한 처리가 완벽하지 못해서 제한 시간 내에 풀지 못했다
  • for문으로 연산자를 확인했을 때 곧바로 처리해야 한다는 생각에 틀에 갇혀있었던 것 같다.
    특정 연산자를 만났을 때 res에 올바른 값이 모두 기입된 채로 넘어가야 하는 것은 아니였다.
    현재 바라보고 있는 연산자를 당장 처리해야하지 않는다면 stack에 쌓아두고,
    다음 연산자를 탐색했을 때 이전의 값을 가지고, res에 추가할지 여부를 따져도 늦지 않는다는 점을 배울 수 있었다