ν°μ€ν 리 λ·°
μ€νμ μμ© - νμ νκΈ° μμ κ³μ°
yeahajeong 2020. 6. 24. 14:52νμ νκΈ° μμ κ³μ°
λ¬Έμ μ€λͺ
μΈμλ‘ μ£Όμ΄μ§ λ¬Έμμ΄ expr μ μκ΄νΈμ μ¬μΉμ°μ° κΈ°νΈ, κ·Έλ¦¬κ³ μ μλ€λ‘λ§ μ΄λ£¨μ΄μ§ μ€μ νν μμμ λλ€. ν¨μ solution() μ μ΄ μμμ κ°μ κ³μ°νμ¬ κ·Έ κ²°κ³Όλ₯Ό 리ν΄νλλ‘ μμ±λμ΄ μμ΅λλ€. μ΄ ν¨μλ μ°¨λ‘λ‘ splitTokens(), infixToPostfix(), κ·Έλ¦¬κ³ postfixEval() ν¨μλ₯Ό νΈμΆνμ¬ μ΄ μμμ κ°μ κ³μ°νλλ°,
- splitTokens() - κ°μ λ΄μ©μμμ κ°μ μ½λλ‘ μ΄λ―Έ ꡬνλμ΄ μμ΅λλ€.
- infixToPostfix() - μ§λ κ°μμ μ°μ΅λ¬Έμ μμ μμ±νλ μ½λλ₯Ό μμ νμ¬, λ¬Έμμ΄μ΄ μλ 리μ€νΈλ₯Ό 리ν΄νλλ‘ μμ±ν©λλ€.
- postfixEval() - μ΄λ² κ°μμ μ°μ΅λ¬Έμ μ λλ€. ν¨μμ λ΄μ©μ μμ±νμΈμ.
μ¦, λ κ°μ ν¨μ infixToPostfix() μ postfixEval() μ ꡬννλ μ°μ΅μ λλ€. μ€νμ μ΄μ©νκΈ° μνμ¬ class ArrayStack μ΄ μ μλμ΄ μμΌλ―λ‘ κ·Έκ²μ νμ©νμΈμ.
[μ°Έκ³ ] Python μλ eval() μ΄λΌλ built-in ν¨μκ° μμ΄μ, μ΄ ν¨μμ λ¬Έμμ΄μ μΈμλ‘ μ λ¬νλ©΄, κ·Έ λ¬Έμμ΄μ κ·Έλλ‘ Python ννμμΌλ‘ κ°μ£Όνκ³ κ³μ°ν κ²°κ³Όλ₯Ό 리ν΄νλλ‘ λμ΄ μμ΅λλ€. μ΄ built-in ν¨μ eval() μ μ΄μ©νλ©΄ μ΄ μ°μ΅λ¬Έμ λ μ ν μ§μ μ½λλ₯Ό μμ±νμ§ μκ³ λ μ λ΅μ λΌ μ μμ κ²μ΄μ§λ§, μ€νμ μ΄μ©νμ¬ μ€μννμμ κ³μ°νλ νλ‘κ·Έλλ° μ°μ΅μ μν κ²μ΄λ, κ°μ λ΄μ©μμ μ€λͺ ν μ μ°¨λ₯Ό μννλλ‘ μ½λλ₯Ό μμ±ν΄ 보μΈμ.
μκ³ λ¦¬μ¦ μ€κ³
- νμ ννμμ μΌμͺ½λΆν° ν κΈμμ© μ½μ΄μ
- νΌμ°μ°μλ₯Ό λ§λλ©΄ μ€νμ push
- μ°μ°μλ₯Ό λ§λλ©΄ μ€νμμ pop -> (1), λ pop -> (2)
- "(2) μ°μ° (1) " μ κ³μ°ν΄μ μ΄ κ²°κ³Όλ₯Ό μ€νμ push
- μ΄ κ³Όμ μ λ°λ³΅νλ€κ° μμμ λμ λλ¬νλ©΄ νλμ λ°μ΄ν°κ° μ€νμ λ¨κ² λλλ° μ΄κ²μ pop
μ½λ ꡬν
class Stack:
# λΉ μ€νμ λ°°μ΄λ‘ μ΄κΈ°ν
def __init__(self):
self.data = []
# μ€νμ ν¬κΈ°
def size(self):
return len(self.data)
# λΉ μ€ν νλ¨ μ¬λΆ
def isEmpty(self):
return self.size() == 0
# λ°μ΄ν° μμ μΆκ°
def push(self, item):
self.data.append(item)
# λ°μ΄ν° μμ μμ (리ν΄)
def pop(self):
return self.data.pop()
# μ€νμ κΌλκΈ° μμ λ°ν
def peek(self):
return self.data[-1]
# μκ° λ¬Έμμ΄λ‘ μ£Όμ΄μ Έ μμ λ (λͺμ리μμΈμ§ λͺ¨λ₯΄λμν)
# κ°κ°μ νΌμ°μ°μμΈ μμ μ°μ°μμΈ κΈ°νΈλ‘ λΆλ¦¬ν΄μ 리μ€νΈλ‘ λ§λλ μμ
# exprStr -> μ€μ ννμμΌλ‘λ μμ
def splitTokens(exprStr):
tokens = []
val = 0 # κ° μ리 μ«μλ₯Ό λ΄λ λ³μ
valProcessing = False #
for c in exprStr:
# λΉμΉΈμ΄ λ€μ΄μμΌλ©΄ κ·Έλ₯ λμ΄κ°
if c == ' ':
continue
# μ«μλ₯Ό λ§λλ©΄ 10μ§μλ‘ λ³ννλ κ³Όμ
if c in '0123456789' :
val = val * 10 + int(c)
valProcessing = True # μλ₯Ό λ§λ¬μΌλ―λ‘ true
# μ«μκ° μλλΌλ©΄ (κ΄νΈ λλ μ°μ°μλ₯Ό λ§λ¬λ€κ³ κ°μ£Ό) 10μ§μ ννμ΄ λλκ²
else:
if valProcessing:
tokens.append(val)
val = 0
valProcessing = False # μ§κΈ 10μ§μλ₯Ό μ²λ¦¬νκ³ μμ§ μλ€
tokens.append(c)
# λ§μ§λ§ μ μ²λ¦¬
if valProcessing:
tokens.append(val)
return tokens
# μ€μ νκΈ°λ² -> νμ νκΈ°λ²μΌλ‘ λ°κΎΈλ ν¨μ
def infixToPostfix(tokenList):
prec = {
'*' : 3,
'/' : 3,
'+' : 2,
'-' : 2,
'(' : 1
}
opStack = Stack()
postfixList = []
for token in tokenList:
# νΌμ°μ°μμ΄λ©΄ 리μ€νΈμ μΆκ°
if type(token) is int:
postfixList.append(token)
# '('μ΄λ©΄ μ€νμ push
elif token == '(':
opStack.push(token)
# ')' μ΄λ©΄ '('κ° λμ¬λκΉμ§ pop
elif token == ')':
while opStack.peek() != '(':
postfixList.append(opStack.pop())
opStack.pop()
# μ°μ°μμ΄λ©΄ +-*/
else:
# μ€νμ΄ λΉμ΄μμ κ²½μ° μ€νμ push
if opStack.isEmpty():
opStack.push(token)
# μ€νμ΄ λΉμ΄μμ§ μλ€λ©΄ λΉκ΅
else:
# μ€νμ κ°μ΄ μ‘΄μ¬ν λμμ λ°λ³΅
while opStack.size() > 0:
# μ°μ μμκ° μ€νμμ μλκ² λμΌλ©΄ κΊΌλΈλ€
if prec[opStack.peek()] >= prec[token]:
postfixList.append(opStack.pop())
else:
break
opStack.push(token)
# λ°λ³΅λ¬Έμ λ€ λκ³ μ€νμ΄ λΉλκΉμ§ pop
while not opStack.isEmpty():
postfixList.append(opStack.pop())
# 리μ€νΈλ‘ 리ν΄νλ€
return postfixList
# νμ νκΈ°λ²μ κ³μ°νλ ν¨μ
def postfixEval(tokenList):
valStack = Stack()
for token in tokenList:
# νΌμ°μ°μλ₯Ό λ§λλ©΄ μ€νμ push
if type(token) is int:
valStack.push(token)
# μ°μ°μλ₯Ό λ§λλ©΄
elif token == '+':
n1 = valStack.pop()
n2 = valStack.pop()
valStack.push(n2+n1)
elif token == '-':
n1 = valStack.pop()
n2 = valStack.pop()
valStack.push(n2-n1)
elif token == '*':
n1 = valStack.pop()
n2 = valStack.pop()
valStack.push(n2*n1)
elif token == '/':
n1 = valStack.pop()
n2 = valStack.pop()
valStack.push(int(n2/n1))
return valStack.pop()
def solution(expr):
# μ€μννμμ tokensμ 리μ€νΈ ννλ‘ λ³ν(νΌμ°μ°μ, μ°μ°μ, κ΄νΈ)
tokens = splitTokens(expr)
# 리μ€νΈ ννλ‘ μ μ₯λ ν ν°μ μμλλ‘ νμννμμΌλ‘ λ³ν
postfix = infixToPostfix(tokens)
# νμννμμ κ³μ°
val = postfixEval(postfix)
return val
expr = "10/2"
tokens = splitTokens(expr)
postfix = infixToPostfix(tokens)
val = postfixEval(postfix)
print(tokens)
print(postfix)
print(val)
'(ꡬ)μλ£κ΅¬μ‘°&μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νν ν (Circular Queue) (0) | 2020.06.24 |
---|---|
ν (Queues) (0) | 2020.06.24 |
μ€νμ μμ© - μμμ νμ νκΈ°λ² (Postfix Notation) (0) | 2020.06.23 |
μ€ν(Stacks) - μμμ κ΄νΈ μ ν¨μ± κ²μ¬ (0) | 2020.06.23 |
μ€ν(Stacks) (1) | 2020.06.22 |
- Total
- Today
- Yesterday
- κ²μν μ‘°ν
- λΆνΈ μλμμ±
- μ΄ν΄λ¦½μ€ νκΈ μΈμ½λ©
- κ²μλ¬Όμ‘°ν
- κ²μν μμ
- Java
- tomcatμ€μΉ
- java νκ²½λ³μ
- μκ³ λ¦¬μ¦
- typeAliases
- μλ°
- κ²μλ¬Ό μμ
- μ€νλ§λΆνΈ μλμμ±
- κ²μνλ§λ€κΈ°
- κ°λ°
- κ°λ°ν경ꡬμΆ
- μ¨λ¦¬μμ€
- μλ£κ΅¬μ‘°
- λ³λͺ μ²λ¦¬
- μ 체κ²μλ¬Ό μ‘°ν
- μ΄ν΄λ¦½μ€ μ€μΉ
- mysqlμ€μΉ
- java jdk μ€μΉ
- Algorithm
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |