๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

4. ํ›„์œ„์—ฐ์‚ฐ(stack)_ํŒŒ์ด์ฌ

by @ENFJ 2025. 2. 13.

๐Ÿš€์ „์ฒด ์ฝ”๋“œ

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

a = input()
print(a)

stack = []
res = ''

for x in a:
    # x๊ฐ€ ์ˆซ์ž์ผ ๊ฒฝ์šฐ
    if x.isdecimal():
        stack.append(int(x))
    # x๊ฐ€ ์ˆซ์ž๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ
    else:
        if x =='+':
            n1 = stack.pop()
            n2 = stack.pop()
            stack.append(n2+n1)
        elif x =='-':
            n1 = stack.pop()
            n2 = stack.pop()
            stack.append(n2-n1)
        elif x == '*':
            n1 = stack.pop()
            n2 = stack.pop()
            stack.append(n2*n1)
        elif x == '/':
            n1 = stack.pop()
            n2 = stack.pop()
            stack.append(n2/n1)
print(stack[0])

 

 


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

ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ๋’ค์— ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์œผ๋ฉด์„œ ์ˆซ์ž๋Š” ์Šคํƒ์— ๋„ฃ๊ณ , ์—ฐ์‚ฐ์ž๋Š” ๊บผ๋‚ด์„œ ๊ณ„์‚ฐํ•˜๋ฉด ๋ผ.

๐Ÿ“ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ์˜ˆ์ œ

๋ณต์‚ฌํŽธ์ง‘
3 5 2 * + 8 -

→ ๊ณ„์‚ฐ ์ˆœ์„œ:

  1. 3 → ์Šคํƒ์— push
  2. 5 → ์Šคํƒ์— push
  3. 2 → ์Šคํƒ์— push
  4. * → 5 * 2 = 10, ๊ฒฐ๊ณผ๋ฅผ ์Šคํƒ์— push
  5. + → 3 + 10 = 13, ๊ฒฐ๊ณผ๋ฅผ ์Šคํƒ์— push
  6. 8 → ์Šคํƒ์— push
  7. - → 13 - 8 = 5, ๊ฒฐ๊ณผ๋ฅผ ์Šคํƒ์— push
    โžก ์ตœ์ข… ๊ฒฐ๊ณผ = 5

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

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

๐Ÿ”ข ์ˆซ์ž์ธ ๊ฒฝ์šฐ → ์Šคํƒ์— push

if x.isdecimal(): stack.append(int(x))
 
  • isdecimal() → ์ˆซ์ž์ธ์ง€ ํ™•์ธ
  • ์ˆซ์ž๋ฉด ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์Šคํƒ์— push

โž•โž– ๊ณฑ์…ˆ/๋‚˜๋ˆ—์…ˆ ์ฒ˜๋ฆฌ

else: if x == '+': n1 = stack.pop() n2 = stack.pop() stack.append(n2 + n1) elif x == '-': n1 = stack.pop() n2 = stack.pop() stack.append(n2 - n1) elif x == '*': n1 = stack.pop() n2 = stack.pop() stack.append(n2 * n1) elif x == '/': n1 = stack.pop() n2 = stack.pop() stack.append(n2 / n1)
  • ์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด ์Šคํƒ์—์„œ ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๊บผ๋ƒ„
  • n2๊ฐ€ ๋จผ์ € pop() → ์—ฐ์‚ฐ์˜ ์™ผ์ชฝ ์ˆซ์ž
  • n1์ด ๋‹ค์Œ pop() → ์—ฐ์‚ฐ์˜ ์˜ค๋ฅธ์ชฝ ์ˆซ์ž
  • ๊ณ„์‚ฐ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์Šคํƒ์— push

โœ… ์ตœ์ข… ๊ฒฐ๊ณผ ์ถœ๋ ฅ

print(stack[0])
  • ์Šคํƒ์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด ์ •๋‹ต์ด๋ฏ€๋กœ ์ถœ๋ ฅ

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

์ž…๋ ฅ

352*+8-

๊ณ„์‚ฐ ๊ณผ์ • (์Šคํƒ ์ƒํƒœ)

๋ฌธ์ž์—ฐ์‚ฐ์Šคํƒ ์ƒํƒœ

3 push [3]
5 push [3, 5]
2 push [3, 5, 2]
* 5 * 2 = 10 → push [3, 10]
+ 3 + 10 = 13 → push [13]
8 push [13, 8]
- 13 - 8 = 5 → push [5]

์ถœ๋ ฅ ๊ฒฐ๊ณผ

5

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

  • O(n) → ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ์ˆ˜์‹์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๋ฉด์„œ ์—ฐ์‚ฐ
  • ์Šคํƒ ์—ฐ์‚ฐ(push, pop) → O(1) ์ด๋ฏ€๋กœ ์ „์ฒด์ ์œผ๋กœ ๋งค์šฐ ๋น ๋ฆ„

๐Ÿ”น ์ •๋ฆฌ

โœ… ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ์ˆ˜์‹์„ ์Šคํƒ์„ ์‚ฌ์šฉํ•ด ๊ณ„์‚ฐ
โœ… ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด ์ˆซ์ž ๋‘ ๊ฐœ๋ฅผ ๊บผ๋‚ด์„œ ๊ณ„์‚ฐ ํ›„ ๋‹ค์‹œ push
โœ… ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n), ๋งค์šฐ ํšจ์œจ์ 