๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๐Ÿ’ก

3. ํ›„์œ„ ํ‘œ๊ธฐ์‹ ๋งŒ๋“ค๊ธฐ : infix-->postfix (์Šคํƒ)

by @ENFJ 2025. 2. 13.

โœ… ์ „์ฒด์ฝ”๋“œ

import sys
from unicodedata import decimal
sys.stdin=open("C:\\\\input.txt",'rt')

a = input()
stack = []
res=''

print(a)

for x in a:
    # ์ž…๋ ฅ๊ฐ’ x ๊ฐ€ ์ˆซ์ž๋ผ๋ฉด
    if x.isdecimal():
        res += x
    # x๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด๋ฉด
    else:
        if x == '(':
            stack.append(x)
        elif x=='*' or x =='/':
            while stack and (stack[-1] == '*' or stack[-1] =='/'):
                res += stack.pop()
            stack.append(x)
        elif x =='+' or x=='-':
            while stack and stack[-1] !='(':
                res += stack.pop()
            
            stack.append(x)
        elif x == ')':
            while stack and stack[-1] !='(':
                res+=stack.pop()
            stack.pop()
while stack:
    res += stack.pop()

print(res)

 

 


๐Ÿ“Œ ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ• vs ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•

์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•

3 + 5 3 5 +
(3 + 5) * 2 3 5 + 2 *
3 + 5 * 2 3 5 2 * +

ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ๊ด„ํ˜ธ ์—†์ด๋„ ์—ฐ์‚ฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ™•ํžˆ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ด!
์ด ์ฝ”๋“œ๋Š” ์Šคํƒ์„ ์‚ฌ์šฉํ•ด ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์•ผ.


๐Ÿ” ์ฝ”๋“œ ๋ถ„์„

 
import sys sys.stdin = open("C:\\Users\\csh\\Documents\\์ฝ”๋”ฉํ…Œ์ŠคํŠธ\\์ž๋ฃŒ๊ตฌ์กฐํ™œ์šฉ(์Šคํƒ,ํ,ํ•ด์‰ฌ,ํž™)\\input.txt", 'rt') a = input() # ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ• ์ˆ˜์‹ ์ž…๋ ฅ stack = [] # ์—ฐ์‚ฐ์ž๋ฅผ ์ €์žฅํ•  ์Šคํƒ res = '' # ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด (ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ๋ณ€ํ™˜ ๊ฒฐ๊ณผ)
  • a: ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋œ ์ˆ˜์‹ ์ž…๋ ฅ
  • stack: ์—ฐ์‚ฐ์ž๋ฅผ ์ €์žฅํ•˜๋Š” ์Šคํƒ
  • res: ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜๋œ ๊ฒฐ๊ณผ

๐Ÿ”ข ์ˆซ์ž(0~9)์ธ ๊ฒฝ์šฐ → ๋ฐ”๋กœ ๊ฒฐ๊ณผ(res)์— ์ถ”๊ฐ€

 
if x.isdecimal(): res += x
  • ์ˆซ์ž๋Š” ๋ฐ”๋กœ res์— ์ถ”๊ฐ€ → ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ์ˆซ์ž์˜ ์ˆœ์„œ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ.

๐Ÿ”ง ์—ฐ์‚ฐ์ž(+, -, *, /, (, )) ์ฒ˜๋ฆฌ

1๏ธโƒฃ ( (์—ด๋ฆฐ ๊ด„ํ˜ธ)

 
elif x == '(': stack.append(x)
  • ์—ด๋ฆฐ ๊ด„ํ˜ธ๋Š” ๋ฌด์กฐ๊ฑด ์Šคํƒ์— push

2๏ธโƒฃ *, / (๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ)

elif x == '*' or x == '/': while stack and (stack[-1] == '*' or stack[-1] == '/'): res += stack.pop() stack.append(x)
  • *์™€ /๋Š” ๊ฐ™์€ ์šฐ์„ ์ˆœ์œ„๋ผ๋ฆฌ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์—ฐ์‚ฐํ•ด์•ผ ํ•จ
  • ์Šคํƒ์˜ top์ด * ๋˜๋Š” /์ด๋ฉด popํ•ด์„œ res์— ์ถ”๊ฐ€
  • ์ดํ›„ ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ฅผ push

3๏ธโƒฃ +, - (๋ง์…ˆ, ๋บ„์…ˆ)

 
elif x == '+' or x == '-': while stack and stack[-1] != '(': res += stack.pop() stack.append(x)
  • +, -๋Š” *, /๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์Œ
  • ์Šคํƒ์— ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์œผ๋ฉด popํ•˜์—ฌ res์— ์ถ”๊ฐ€
  • ์ดํ›„ ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ฅผ push

4๏ธโƒฃ ) (๋‹ซ๋Š” ๊ด„ํ˜ธ)

elif x == ')': while stack and stack[-1] != '(': res += stack.pop() stack.pop() # ์—ฌ๋Š” ๊ด„ํ˜ธ '(' ์ œ๊ฑฐ
  • )๊ฐ€ ๋‚˜์˜ค๋ฉด ์—ฌ๋Š” ๊ด„ํ˜ธ (๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ popํ•ด์„œ res์— ์ถ”๊ฐ€
  • (๋Š” ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋งŒ ํ•˜๊ณ  res์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ

๐Ÿ“Œ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ํ™•์ธํ•œ ํ›„, ์Šคํƒ์— ๋‚จ์€ ์—ฐ์‚ฐ์ž ์ •๋ฆฌ

 
while stack: res += stack.pop()
  • ์Šคํƒ์— ๋‚จ์€ ์—ฐ์‚ฐ์ž๋“ค์„ ์ฐจ๋ก€๋กœ res์— ์ถ”๊ฐ€
  • ์ด์ œ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ ์™„๋ฃŒ!

๐Ÿ’ก ์‹คํ–‰ ์˜ˆ์ œ

์ž…๋ ฅ:

3+(5*2)-8

๋ณ€ํ™˜ ๊ณผ์ •

๋ฌธ์ž์—ฐ์‚ฐ์Šคํƒ ์ƒํƒœํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• (res)

3 ์ˆซ์ž → res ์ถ”๊ฐ€ [] 3
+ ์—ฐ์‚ฐ์ž → stack ์ถ”๊ฐ€ ['+'] 3
( ์—ฐ์‚ฐ์ž → stack ์ถ”๊ฐ€ ['+', '('] 3
5 ์ˆซ์ž → res ์ถ”๊ฐ€ ['+', '('] 3 5
* ์—ฐ์‚ฐ์ž → stack ์ถ”๊ฐ€ ['+', '(', '*'] 3 5
2 ์ˆซ์ž → res ์ถ”๊ฐ€ ['+', '(', '*'] 3 5 2
) (๊นŒ์ง€ pop → res ์ถ”๊ฐ€ ['+'] 3 5 2 *
- + pop → res ์ถ”๊ฐ€, - push ['-'] 3 5 2 * +
8 ์ˆซ์ž → res ์ถ”๊ฐ€ ['-'] 3 5 2 * + 8
EOF ์Šคํƒ pop → res ์ถ”๊ฐ€ [] 3 5 2 * + 8 -

์ถœ๋ ฅ ๊ฒฐ๊ณผ:

 
3 5 2 * + 8 -

โณ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • O(n): ํ•œ ๋ฒˆ์˜ ๋ฌธ์ž์—ด ์ˆœํšŒ(for) + ์—ฐ์‚ฐ์ž ์ฒ˜๋ฆฌ(while)
  • ์Šคํƒ ์‚ฌ์šฉ์œผ๋กœ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌ!
 

๐Ÿš€ ์ •๋ฆฌ

โœ… ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์„ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
โœ… ์Šคํƒ์„ ์‚ฌ์šฉํ•ด ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ ๊ด€๋ฆฌ
โœ… **์‹œ๊ฐ„ ๋ณต์žก๋„ O(n)**์œผ๋กœ ํšจ์œจ์ ์ธ ์—ฐ์‚ฐ

์ด์ œ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•œ ์ˆ˜์‹์„ ์Šคํƒ์„ ์ด์šฉํ•ด ๊ณ„์‚ฐํ•  ์ˆ˜๋„ ์žˆ์–ด!
์ดํ•ด ์•ˆ ๋˜๋Š” ๋ถ€๋ถ„ ์žˆ์œผ๋ฉด ์งˆ๋ฌธํ•ด์ค˜ ๐Ÿ˜Š๐Ÿ”ฅ