ν°μ€ν 리 λ·°
μ€νμ μμ© - νμ νκΈ° μμ κ³μ°
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
- tomcatμ€μΉ
- κ²μλ¬Όμ‘°ν
- Java
- mysqlμ€μΉ
- μ 체κ²μλ¬Ό μ‘°ν
- μ¨λ¦¬μμ€
- Algorithm
- λΆνΈ μλμμ±
- java jdk μ€μΉ
- λ³λͺ μ²λ¦¬
- μλ°
- κ²μλ¬Ό μμ 
- typeAliases
- κ°λ°
- κ°λ°ν경ꡬμΆ
- μ€νλ§λΆνΈ μλμμ±
- java νκ²½λ³μ
- μλ£κ΅¬μ‘°
- μ΄ν΄λ¦½μ€ νκΈ μΈμ½λ©
- κ²μν μ‘°ν
- κ²μνλ§λ€κΈ°
- μκ³ λ¦¬μ¦
- κ²μν μμ 
- μ΄ν΄λ¦½μ€ μ€μΉ
| μΌ | μ | ν | μ | λͺ© | κΈ | ν | 
|---|---|---|---|---|---|---|
| 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 |