ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ• ( infix notation )

  • ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž๋“ค์˜ ์‚ฌ์ด์— ์œ„์น˜
  • ( A + B ) * ( C + D )

ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ• ( postfix notation )

  • ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž๋“ค์˜ ๋’ค์— ์œ„์น˜
  • A B + C D + *

 

 

 

์ค‘์œ„ ํ‘œํ˜„์‹ -> ํ›„์œ„ ํ‘œํ˜„์‹

์Šคํƒ์— ์žˆ๋Š” ์ˆ˜์‹์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„ ๋•Œ ๋จผ์ € ๊บผ๋‚ธ๋‹ค
A + B * C

 

 

 

๊ด„ํ˜ธ์˜ ์ฒ˜๋ฆฌ

์—ฌ๋Š” ๊ด„ํ˜ธ๋Š” ์Šคํƒ์— 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

 

 

ํ…Œ์ŠคํŠธ 7๊ณผ 8์—์„œ ์‹คํŒจ,,

 

๋‘๋ฒˆ์งธ๋กœ ํ‘ผ ์ฝ”๋“œ

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

์ƒˆ๋กœ์šด ๋งˆ์Œ์œผ๋กœ ๋‹ค์‹œ ํ’€์–ด๋ดค๋‹ค. ํ•ด๊ฒฐํ–ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๋„ค ํฅ

 

 

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€