๋ฌธ์ ํด๊ฒฐ ๊ณผ์
โ๏ธ ๋๋ง์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์ ๋ฆฌํ๊ธฐ (=์ฒด๊ณํ)
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)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๋๋ ์
์ซ์๋ ์คํ์ ๋ฃ๊ณ , ์ฐ์ฐ์๋ ์คํ์์ ๊บผ๋ด ๊ณ์ฐํ๋ค๋ ์ฌ๊ณ ๋ ์ข์์ผ๋,
๊ตฌํ์์ ๋ ผ๋ฆฌ ์ค๋ฅ๊ฐ ์์๋ ๊ฒ ๊ฐ์ ์์ฝ๋ค.
'๐ซ ETC > Leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Week 2-1. [Hash Table] 219. Contains Duplicate II (Python3) (0) | 2023.08.30 |
---|---|
Week 2-1. [Hash Table] 1. Two Sum (Python3) (0) | 2023.08.30 |
Week 1-2. [Stack] 155. Min Stack (Python3) (0) | 2023.08.29 |
Week 1-2. [Linked List] 21. Merge Two Sorted Lists (Python3) (0) | 2023.08.29 |
Week 1-2. [Linked List] 2. Add Two Numbers (Python3) (0) | 2023.08.29 |