๐Ÿ’ซ ETC/Leetcode

Week 1-2. [Stack] 150. Evaluate Reverse Polish Notation (Python)

ming412 2023. 8. 29. 00:41

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

https://leetcode.com/problems/evaluate-reverse-polish-notation/?envType=study-plan-v2&envId=top-interview-150 

 

Evaluate Reverse Polish Notation - LeetCode

Can you solve this real interview question? Evaluate Reverse Polish Notation - You are given an array of strings tokens that represents an arithmetic expression in a Reverse Polish Notation [http://en.wikipedia.org/wiki/Reverse_Polish_notation]. Evaluate t

leetcode.com

ํ›„์œ„ํ‘œ๊ธฐ์‹์„ ๊ณ„์‚ฐํ•˜๋ผ.
  • ์œ ํšจํ•œ ์—ฐ์‚ฐ์ž๋Š” +, -, *, / ์ด๋‹ค.
  • ๋‘ ์ •์ˆ˜ ์‚ฌ์ด ๋‚˜๋ˆ—์…ˆ์€ always truncates toward zero
  • 0์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์ผ์€ ์—†๋‹ค.

๐Ÿ”Ž ์–ด๋–ค ์‹์œผ๋กœ ์ ‘๊ทผํ–ˆ๋Š”๊ฐ€?

์ฃผ์–ด์ง„ tokens ์ค‘ ์ˆซ์ž๋Š” ๋ฌด์กฐ๊ฑด ์Šคํƒ์— ์ง‘์–ด ๋„ฃ๋Š”๋‹ค. ์—ฐ์‚ฐ์ž๋Š” ์Šคํƒ์—์„œ ์ˆซ์ž๋ฅผ ๊บผ๋‚ด ๊ณ„์‚ฐํ•œ ๋’ค ๊ฒฐ๊ณผ๋ฅผ ์Šคํƒ์— ์ง‘์–ด ๋„ฃ๋Š”๋‹ค.

 

๐Ÿ™ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ: ์ž…๋ ฅ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ

๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด tokens๋ฅผ ์ˆœํšŒํ•  ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“ ์˜์‚ฌ ์ฝ”๋“œ

tokens์—์„œ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ธ๋‹ค:
	if (์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด):
    	์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.
    else:
    	์Šคํƒ์˜ top์— ์žˆ๋Š” ๊ฐ’ ๋‘ ๊ฐœ๋ฅผ ๊ฐ€์ ธ์™€ ํ•ด๋‹น ์—ฐ์‚ฐ์ž์™€ ๊ณ„์‚ฐํ•œ๋‹ค.
        ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ stack์— ๋„ฃ๋Š”๋‹ค.
        
๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋œ ํ›„ stack[0]์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stk = []
        for x in tokens:
            if x not in '+-*/':
                stk.append(x)
            else:
                a, b = stk.pop(), stk.pop()
                tmp = eval(str(b) + x + str(a))
                if x == '/':
                    if int(a) < 0 or int(b) < 0:
                        stk.append(round(tmp))
                    else:
                        stk.append(eval(str(b) + '//' + str(a)))
                else:
                    stk.append(tmp)

        return int(stk[0])

 

๋‚ด ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

linear search ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N)์ด๋‹ค.

 

โœ๏ธ ์„ฑ๋Šฅ ํšŒ๊ณ 

์„ฑ๋Šฅ์€ ๋‚˜์˜์ง€ ์•Š์œผ๋‚˜ ๋ชจ๋“  ํžˆ๋“  ์ผ€์ด์Šค๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

๐Ÿ’ก ๋ฌด์—‡์„/์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

tokens์— ์Œ์ˆ˜๋„ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์Œ์ˆ˜ ๊ณ„์‚ฐ์—์„œ ์˜๋„์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด, 6/(-132)๋Š” ์‹ค์ œ๋กœ -0.045454545454545456 ์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ–ˆ๋˜ ๊ฒƒ์€ ์ด๋ฅผ 0์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ์—๋Š” 6//(-132)๋ผ๊ณ  ์ ์šฉํ•˜์˜€์œผ๋‚˜ ์ด๋Š” ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ -1์ด ๋‚˜์˜จ๋‹ค.

๋”ฐ๋ผ์„œ A//B ์—์„œ A ํ˜น์€ B๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ทธ ์™ธ์˜ ์–ด๋–ค ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š”์ง€๋Š” ์•Œ์•„๋‚ด์ง€ ๋ชปํ–ˆ๋‹คใ… 

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ํƒ๊ตฌํ•ด๋ณด๊ธฐ

๐ŸŽฏ ๊ตฌํ˜„ ์ฝ”๋“œ

์šฐ์„ , ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š” tokens์˜ ์š”์†Œ(=x)๋“ค์€ str์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— ์Šคํƒ์— ๋„ฃ์–ด์ค„ ๋•Œ int(x)๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ์•„๋ž˜์—์„œ ํŽธํ•˜๋‹ค.

์Šคํƒ์—์„œ ๋‘ ๊ฐœ๋ฅผ popํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ์™€ ๊ฐ™์ง€๋งŒ, ์•„๋ž˜์—์„œ๋Š” eval์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ฑด๋ฌธ์„ ์ด์šฉํ•ด ์ง์ ‘ ๊ณ„์‚ฐํ–ˆ๋‹ค.

ํŠนํžˆ ์Œ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ๋‚˜๋ˆ—์…ˆ์„ int(b/a)๋กœ ๊ณ„์‚ฐํ•˜์˜€๋‹ค.

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stk = []
        for x in tokens:
            if x not in '+-*/':
                stk.append(int(x))
            else:
                a, b = stk.pop(), stk.pop()
                if x == '+':
                    stk.append(b+a)
                elif x == '-':
                    stk.append(b-a)
                elif x == '*':
                    stk.append(b*a)
                else:
                    stk.append(int(b/a))

        return int(stk[0])

 

โฑ ์„ฑ๋Šฅ ์ธก์ • (์‹œ๊ฐ„๋ณต์žก๋„/๊ณต๊ฐ„๋ณต์žก๋„)

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

๋А๋‚€ ์ 

์ˆซ์ž๋Š” ์Šคํƒ์— ๋„ฃ๊ณ , ์—ฐ์‚ฐ์ž๋Š” ์Šคํƒ์—์„œ ๊บผ๋‚ด ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ์‚ฌ๊ณ ๋Š” ์ข‹์•˜์œผ๋‚˜,

๊ตฌํ˜„์—์„œ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์•„ ์•„์‰ฝ๋‹ค.