๐Ÿงท ๋ฌธ์ œ

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

์ฃผ์–ด์ง„ ์ค‘์œ„ ํ‘œ๊ธฐ์‹(infix)์„ ํ›„์œ„ ํ‘œ๊ธฐ์‹(postfix)๋กœ ๋ฐ”๊พธ๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ฌธ์ œ์— ๋‚˜์™€์žˆ๋‹ค์‹œํ”ผ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ์Šคํƒ์—์„œ push, pop์˜ ๊ณผ์ •์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ›  ํ’€์ด

์ด ๋ฌธ์ œ์˜ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋น„๊ตํ•  ๋•Œ, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™๋‹ค๋ฉด stack์•ˆ์— ๋“ค์–ด์žˆ๋Š”, ์ฆ‰ ์‹์—์„œ ์™ผ์ชฝ์— ์œ„์น˜ํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

Step 1.
 expression๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•œ ๋ฌธ์ž์”ฉ ํƒ์ƒ‰ํ•œ๋‹ค.
 expression[i]๊ฐ€ ์•ŒํŒŒ๋ฒณ์ด๋ผ๋ฉด res๋ผ๋Š” ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— appendํ•ด์ค€๋‹ค.

Step 2.
 expression[i]๊ฐ€ ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹ˆ๊ณ  ์—ฐ์‚ฐ์ž๋ผ๋ฉด ์šฐ์„ ์ˆœ์œ„์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.
 expression[i]๊ฐ€ (, ์—ฌ๋Š” ๊ด„ํ˜ธ๋ผ๋ฉด ์ผ๋‹จ stack์— push ํ•ด์ค€๋‹ค.
 *๋‚˜ /๋ผ๋ฉด while๋ฌธ์„ ๋Œ๋ฉด์„œ stack์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด stack์˜ top์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ™์€ *๋‚˜ /๋Š” ๋จผ์ € ๋“ค์–ด์™”๊ธฐ ๋•Œ๋ฌธ์— stack์—์„œ pop ํ•œ ํ›„์— res์— append ํ•ด์ค€๋‹ค. ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์—ฐ์‚ฐ์ž๊ฐ€ stack์˜ top ์ผ ๊ฒฝ์šฐ์—๋Š” expression[i]๋ฅผ stack์— push ํ•ด์ค€๋‹ค.
 +๋‚˜ -๋ผ๋ฉด ์ด๋“ค๋ณด๋‹ค ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์—ฐ์‚ฐ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— stack์ด ๋น„์–ด์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ (์ด ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋ชจ๋‘ stack์—์„œ pop ํ•œ ํ›„์— res์— append ํ•ด์ค€๋‹ค.
 )๋ผ๋ฉด stack์˜ top์ด (์ผ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ์—ฐ์‚ฐ์ž๋“ค์„ res์— append ํ•ด์ค€๋‹ค.

Step 3.
 ๋งŒ์•ฝ ์‹์„ ๋‹ค ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ๋„ stack์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด ์–ด์งœํ”ผ stack์€ ์šฐ์„ ์ˆœ์œ„(์ˆœ์„œ)๋Œ€๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— res.append(stack.pop())ํ•ด์ค€๋‹ค.

๐Ÿ–Š ๋‚˜์˜ ์ฝ”๋“œ

import sys

input = sys.stdin.readline

def solution(expression):
    res = []
    stack_operator = []
    for e in expression:
        if e.isalpha():
            res.append(e)

        else:
            if e == '(':
                stack_operator.append(e)

            elif e == '*' or e == '/':
                while stack_operator and (stack_operator[-1] == '*' or stack_operator[-1] == '/'):
                    res.append(stack_operator.pop())
                stack_operator.append(e)

            elif e == '+' or e == '-':
                while stack_operator and stack_operator[-1] != '(':
                    res.append(stack_operator.pop())
                stack_operator.append(e)

            elif e == ')':
                while stack_operator and stack_operator[-1] != '(':
                    res.append(stack_operator.pop())
                stack_operator.pop()

    while stack_operator:
        res.append(stack_operator.pop())

    return res

if __name__ == "__main__":
    exp = list(map(str, input().rstrip()))

    ans = solution(exp)
    for i in ans:
        print(i, end='')