ν‹°μŠ€ν† λ¦¬ λ·°

λ°˜μ‘ν˜•

ν›„μœ„ ν‘œκΈ° μˆ˜μ‹ 계산

문제 μ„€λͺ…

인자둜 주어진 λ¬Έμžμ—΄ 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)

 

룰루

 

λ°˜μ‘ν˜•
λŒ“κΈ€