ํฐ์คํ ๋ฆฌ ๋ทฐ
์คํ์ ์์ฉ - ์์์ ํ์ ํ๊ธฐ๋ฒ (Postfix Notation)
yeahajeong 2020. 6. 23. 13:39์ค์ ํ๊ธฐ๋ฒ ( infix notation )
- ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์๋ค์ ์ฌ์ด์ ์์น
- ( A + B ) * ( C + D )
ํ์ ํ๊ธฐ๋ฒ ( postfix notation )
- ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์๋ค์ ๋ค์ ์์น
- A B + C D + *
์ค์ ํํ์ -> ํ์ ํํ์


๊ดํธ์ ์ฒ๋ฆฌ
์ฌ๋ ๊ดํธ๋ ์คํ์ push, ๋ซ๋ ๊ดํธ๋ฅผ ๋ง๋๋ฉด ์ฌ๋ ๊ดํธ๊ฐ ๋์ฌ ๋ ๊น์ง popํ๋ค.
์ฐ์ฐ์๋ฅผ ๋ง๋ฌ์ ๋, ์ฌ๋ ๊ดํธ ๋๋จธ๊น์ง popํ์ง ์๋๋ก ํ๋ ค๋ฉด ์ฌ๋ ๊ดํธ์ ์ฐ์ ์์๋ ๊ฐ์ฅ ๋ฎ๊ฒ ์ค์ ํด์ผํ๋ค.

์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
์ฐ์ฐ์์ ์ฐ์ ์์ ์ค์ ์ ํ์ด์ฌ ์ฌ์ ์ ํ์ฉํ์ฌ prec๋ฅผ ์์ฑํ๋ค.
์ค์ ํํ์์ ์ผ์ชฝ๋ถํฐ ํ ๊ธ์์ฉ ์ฝ์ด์ ํผ์ฐ์ฐ์์ด๋ฉด ๊ทธ๋ฅ ์ถ๋ ฅ, '('์ด๋ฉด ์คํ์ push, ')'์ด๋ฉด '('์ด ๋์ฌ ๋๊น์ง popํด์ ์ถ๋ ฅํ๋ค. ์ฐ์ฐ์๋ฅผ ๋ง๋๋ฉด ์คํ์์ ์ด๋ณด๋ค ๋๊ฑฐ๋ ๊ฐ์ ์ฐ์ ์์์ธ ๊ฒ๋ค์ popํด์ ์ถ๋ ฅํ๋ค. ์ฐ์ ์์๊ฐ ๊ฐ์๊ฒ์ ์ผ์ชฝ์ ์๋ ์ฐ์ฐ์๋ฅผ pop, ๊ทธ๋ฆฌ๊ณ ์ด ์ฐ์ฐ์๋ฅผ ์คํ์ pushํด๋๋ค.
์คํ์ ๋จ์์๋ ์ฐ์ฐ์๋ ๋ชจ๋ popํด์ ์ถ๋ ฅํ๋ค.
์คํ์ ๋งจ ์์ ์๋ ์ฐ์ฐ์์์ ์ฐ์ ์์ ๋น๊ตํด์ ์ฐ์ ์์๊ฐ ๊ฐ๊ฑฐ๋ ๋์ ์ฐ์ฐ์๋ฅผ popํด์ ์ถ๋ ฅํ๋๋กํ๋ค. ๋น๊ตํ๊ธฐ ์ํด์ ์คํ์ peek() ์ฐ์ฐ์ ์ด์ฉํ๋ค.
์คํ์ ๋จ์์๋ ์ฐ์ฐ์ ๋ชจ๋ pop()ํ๋ ์ํ๋ฌธ์ while not opStack.isEmpty(): ๋ฅผ ์ด์ฉํ๋ค.
๋ฌธ์  ์ค๋ช
์ค์ ํ๊ธฐ๋ฒ์ ๋ฐ๋ฅด๋ ์์ S ๊ฐ ์ธ์๋ก ์ฃผ์ด์ง ๋, ์ด ์์์ ํ์ ํ๊ธฐ๋ฒ์ ๋ฐ๋ฅด๋ ์์์ผ๋ก ๋ณํํ์ฌ ๋ฐํํ๋ ํจ์ solution() ์ ์์ฑํ์ธ์.
์ธ์๋ก ์ฃผ์ด์ง๋ ์์ ๋ฌธ์์ด S ๋ ์๋ฌธ ๋๋ฌธ์ ์ํ๋ฒณ ํ ๊ธ์๋ก ์ด๋ฃจ์ด์ง๋ ๋ณ์ A - Z ๊น์ง์ 4์น์ฐ์ฐ์ ๋ํ๋ด๋ ์ฐ์ฐ์ ๊ธฐํธ +, -, *, /, ๊ทธ๋ฆฌ๊ณ ์ฌ๋ ๊ดํธ์ ๋ซ๋ ๊ดํธ (, ) ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ ๊ณต๋ฐฑ ๋ฌธ์๋ ํฌํจํ์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค. ๋ํ, ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์ง ์์ ์์์ ์ธ์๋ก ์ฃผ์ด์ง์ง ์๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. (์์์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ํ์๊ฐ ์์ต๋๋ค.)
๋ฌธ์ ์์ ๋ฏธ๋ฆฌ ์ฃผ์ด์ง, ์ฐ์ฐ์์ ์ฐ์ ์์๋ฅผ ํํํ python dict ์ธ prec ์ ํ์ฉํ ์ ์์ต๋๋ค.
๋ํ, ์คํ์ ๊ธฐ์ด ๊ฐ์์์ ์ด๋ฏธ ๊ตฌํํ, ๋ฐฐ์ด์ ์ด์ฉํ ์คํ์ ์ถ์์  ์๋ฃ ๊ตฌ์กฐ ์ฝ๋๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ์ด์ฉํ ์ ์์ต๋๋ค.
๋ด๊ฐ ํผ ์ฝ๋
class ArrayStack:
    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]
prec = {
    '*': 3, '/': 3,
    '+': 2, '-': 2,
    '(': 1
}
def solution(S):
    opStack = ArrayStack()
    answer = ''
    flag = False # (๋ฅผ ํ์ธํ๊ธฐ์ํด
    
    for char in S:
        # ํผ์ฐ์ฐ์์ธ ๊ฒฝ์ฐ ๊ทธ๋ฅ ์ถ๋ ฅ
        if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
            answer += char
        
        # ํผ์ฐ์ฐ์๊ฐ ์๋ ๊ฒฝ์ฐ +-*/() ์ธ ๊ฒฝ์ฐ
        else:
            if char == '(':
                flag = True
            elif char == ')':
                flag = False
            
            # ๋น ์คํ์ธ ๊ฒฝ์ฐ์ push
            if opStack.isEmpty() or flag == True:
                if char != '(':
                    opStack.push(char)
            
            # ๋น ์คํ์ด ์๋๋ฉด peek๊ณผ ๋น๊ต
            else:
                if char == ')':
                    answer += opStack.pop()
                else:
                    peek = opStack.peek()
                    if prec[peek] >= prec[char]:
                        answer += opStack.pop()
                        opStack.push(char)
                    else:
                        opStack.push(char)
            
            
    while not opStack.isEmpty():
        answer += opStack.pop()
    return answer


๋๋ฒ์งธ๋ก ํผ ์ฝ๋
class ArrayStack:
    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]
prec = {
    '*': 3, '/': 3,
    '+': 2, '-': 2,
    '(': 1
}
def solution(S):
    opStack = ArrayStack()
    answer = ''
    
    for char in S:
        
        # ํผ์ฐ์ฐ์์ด๋ฉด ๊ทธ๋ฅ ์ถ๋ ฅ
        if char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
            answer += char
        
        # '('์ด๋ฉด ์คํ์ push
        elif char == '(':
            opStack.push(char)
        
        # ')' ์ด๋ฉด '(' ์ด ๋์ฌ ๋๊น์ง pop, ์ถ๋ ฅ
        elif char == ')':
            while opStack.peek() != '(':
                answer += opStack.pop()
            opStack.pop()
        
        # ์ฐ์ฐ์์ผ ๊ฒฝ์ฐ
        else:
            # ๋น ์คํ์ธ ๊ฒฝ์ฐ์ push
            if opStack.isEmpty():
                opStack.push(char)
            else:
            
            	### ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ ###
                peek = opStack.peek()
                if prec[peek] >= prec[char]:
                    answer += opStack.pop()
                    opStack.push(char)
                else:
                    opStack.push(char)
                #########################
                    
    while not opStack.isEmpty():
        answer += opStack.pop() 
                
    return answer์๊พธ ์ด๋ ต๊ฒ ์๊ฐํ ๊ฒ ๊ฐ๋ค. ๊ดํธ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ๋ ์๊พธ answer์ ๊ฐ์ด ๋ค์ด๊ฐ์ ์๊ทธ๋ฐ๊ฑธ๊น ์ค๋ ํ๋ฃจ์ข ์ผ ์งฑ๊ตฌ๋ฅผ ๊ตด๋ ค๋ดค์ง๋ง ๊ทธ๋ฅ ๊ฐ์์์ ๋งํ๋๋๋ก ํ๋ฉด๋๋๊ฒ์ ์ ์ด๋ ต๊ฒ ์๊ฐํ๊ฑธ๊นใ ใ ์ฌํผ ์ฌ๊ธฐ๊น์งํ์ ๋ ํ ์คํธ 7,8์์ ์ค๋ฅ๊ฐ ๋๋ค. ์ง๋ฌธํ๊ธฐ๋ฅผ ์ดํด๋ดค๋๋ฐ
A + B * C - D ์ด ๊ฒฝ์ฐ์์ C๊ฐ ๋ค์ด๊ฐ๊ณ ๊ทธ ๋ค์ -๋ฅผ ๋ง๋ฌ์ ๋ *๋ ์ฒ๋ฆฌ๊ฐ ๋์ง๋ง ๋จผ์  ๋ค์ด๊ฐ์๋ +๋ ๊บผ๋ด์ ์ฒ๋ฆฌํด์ผํ๋๊ฒ ๋ฌธ์ ์๋คใ ใ ๋จธ๋ฆฌ์ํ ์ฃฝ๊ฒ๋ค
์ฐ์ฐ์๋ฅผ ๋ง๋๋ฉด ์ทจํด์ผํ๋ ํ๋
- ํ์ฌ ์คํ์ ๋ค์ด์๋ ์์๋ค์ ๊ฒ์ฌํ๋ฉด์ (ํ์ ์ ์ถ ์์๋ก) ์ง๊ธ ๋ง์ฃผ์น ์ฐ์ฐ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ฑฐ๋ ๊ฐ์ ์ฐ์ฐ์๋ค์ popํ์ฌ answer์ ๋ง๋ถ์ธ๋ค.
- ๊ทธ ํ ์คํ์ด ๋น๊ฑฐ๋ ์ฐ์ ์์๊ฐ ๋ฎ์ ๋์ด ์์นํ ๊ฒฝ์ฐ char๋ฅผ push
class ArrayStack:
    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]
prec = {
    '*': 3, '/': 3,
    '+': 2, '-': 2,
    '(': 1
}
def solution(S):
    opStack = ArrayStack()
    answer = ''
    
    for char in S:
        
        # '('์ด๋ฉด ์คํ์ push
        if char == '(':
            opStack.push(char)
            
        # ')'์ด๋ฉด '('๊ฐ ๋์ฌ ๋๊น์ง pop, ์ถ๋ ฅ
        elif char == ')':
            while opStack.peek() != '(':
                answer += opStack.pop()
            opStack.pop()
            
        # ์ฐ์ฐ์๊ฐ ๋์ฌ ๊ฒฝ์ฐ
        elif char in '+-*/':
            # ์คํ์ด ๋น์ด์์ผ๋ฉด push
            if opStack.isEmpty():
                opStack.push(char)
            # ๋น์ด์์ง ์๋ค๋ฉด ๋น๊ต
            else:
                # ํค๋งธ๋ ๋ถ๋ถใ
ใ
ํด๊ฒฐ
                while opStack.size() > 0 :
                    # ์ฐ์  ์์ ๋น๊ต ํ ๋ฐ์ ์๋ ๋์ด ๋ฎ์ผ๋ฉด ๊บผ๋ด๊ณ  ๊ณ์ ๋น๊ต
                    if prec[opStack.peek()] >= prec[char]:
                        answer += opStack.pop()
                    # ์ฐ์  ์์๊ฐ ๋ฐ์ ์๋ ๋์ด ๋์ผ๋ฉด ๋ฐ๋ณต๋ฌธ ํ์ถ
                    else:
                        break
                opStack.push(char)
                
        # ํผ์ฐ์ฐ์์ธ ๊ฒฝ์ฐ
        else:
            answer += char
    # ์คํ์ด ๋น ๋ ๊น์ง pop
    while not opStack.isEmpty():
        answer += opStack.pop() 
                
    return answer์๋ก์ด ๋ง์์ผ๋ก ๋ค์ ํ์ด๋ดค๋ค. ํด๊ฒฐํ๋ค. ๊ฐ๋จํ๋ค ํฅ
'(๊ตฌ)์๋ฃ๊ตฌ์กฐ&์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํ (Queues) (0) | 2020.06.24 | 
|---|---|
| ์คํ์ ์์ฉ - ํ์ ํ๊ธฐ ์์ ๊ณ์ฐ (0) | 2020.06.24 | 
| ์คํ(Stacks) - ์์์ ๊ดํธ ์ ํจ์ฑ ๊ฒ์ฌ (0) | 2020.06.23 | 
| ์คํ(Stacks) (1) | 2020.06.22 | 
| ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Doubly Listed Lists) (0) | 2020.06.19 | 
- Total
- Today
- Yesterday
- ์จ๋ฆฌ์์ค
- java jdk ์ค์น
- ๋ณ๋ช ์ฒ๋ฆฌ
- ์ดํด๋ฆฝ์ค ์ค์น
- ๊ฐ๋ฐํ๊ฒฝ๊ตฌ์ถ
- ๊ฐ๋ฐ
- mysql์ค์น
- ๊ฒ์ํ ์ญ์ 
- Java
- ์๋ฐ
- ๊ฒ์๋ฌผ ์ญ์ 
- ๋ถํธ ์๋์์ฑ
- ์ดํด๋ฆฝ์ค ํ๊ธ ์ธ์ฝ๋ฉ
- ์คํ๋ง๋ถํธ ์๋์์ฑ
- Algorithm
- java ํ๊ฒฝ๋ณ์
- ๊ฒ์ํ๋ง๋ค๊ธฐ
- ์๊ณ ๋ฆฌ์ฆ
- ์๋ฃ๊ตฌ์กฐ
- typeAliases
- ๊ฒ์๋ฌผ์กฐํ
- ๊ฒ์ํ ์กฐํ
- ์ ์ฒด๊ฒ์๋ฌผ ์กฐํ
- tomcat์ค์น
| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ | 
|---|---|---|---|---|---|---|
| 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 |