μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

4. ν›„μœ„μ—°μ‚°(stack)_파이썬

@ENFJ 2025. 2. 13. 21:37

πŸš€μ „μ²΄ μ½”λ“œ

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), 맀우 효율적