4. ์Šคํƒ ๐Ÿ“š

Borยท2021๋…„ 10์›” 16์ผ
0

์ž๋ฃŒ๊ตฌ์กฐ

๋ชฉ๋ก ๋ณด๊ธฐ
2/7
post-thumbnail

๐Ÿ“š 4.1 ์Šคํƒ์ด๋ž€?

๐Ÿ“š ์Šคํƒ์€ ํ›„์ž…์„ ์ถœ(Last In Fist Out)์˜ ์ž๋ฃŒ๊ตฌ์กฐ!

๋ฉด์ ‘์—์„œ ์ข…์ข… ๋‚˜์˜ค๋Š” ๋ฌธ์ œ์ด๋‹ค. "์Šคํƒ๊ณผ ํ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€?" ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์Šคํƒ์€ ํ›„์ž…์„ ์ถœ์˜ ํ˜•ํƒœ๋กœ ์ž๋ฃŒ์˜ ์ž…์ถœ๋ ฅ์ด ์ผ์–ด๋‚œ๋‹ค. A,B,C,D ์ˆœ์„œ๋กœ ์ž…๋ ฅํ–ˆ๋‹ค๋ฉด ๊บผ๋‚ผ ๋•Œ๋Š” D, C, B, A๋กœ๋งŒ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์œ„์˜ ๋šœ๊ป‘(ํ›„๋‹จ)๋งŒ์„ ์—ด์–ด๋‘” ๊ตฌ์กฐ์™€ ๊ฐ™๋‹ค. ์—ด๋ฆฐ ๊ณณ์„ ๋ณดํ†ต ์Šคํƒ ์ƒ๋‹จ(top)์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ์ƒ๋‹จ์œผ๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ค‘๊ฐ„์œผ๋กœ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ๋ถˆ๊ฐ€ํ•˜๋‹ค.

๐Ÿ“š ์Šคํƒ์€ ์–ด๋””์— ์‚ฌ์šฉํ• ๊นŒ?

์ฒจ ๋“ค์–ด์˜จ ์• ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋จผ์ € ๋‚˜๊ฐ€!๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—ญ์ˆœ์œผ๋กœ ์ด๋ค„์ ธ์•ผ ํ•  ์ถœ๋ ฅ์—์„œ ์š”๊ธดํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

  • ๋ฌธ์„œ ๊ทธ๋ฆผ ctrl+Z์ฒ˜๋Ÿผ ๋˜๋Œ๋ฆฌ๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์Šคํƒ์ด ์‚ฌ์šฉ๋œ๋‹ค. ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ž…๋ ฅ๋˜์—ˆ๋˜ ๋ฐ์ดํ„ฐ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ์ •๋ณด๋ฅผ ์Šคํƒ์— ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.
  • ์•„๋ž˜์—๋„ ๋‚˜์˜ค๊ฒ ์ง€๋งŒ ์†Œ์Šค์ฝ”๋“œ์—์„œ ๊ด„ํ˜ธ ๋‹ซ๊ธฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋๋Š”์ง€ ํ™•์ธํ•  ๋•Œ๋„ ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋˜ํ•œ ๊ณ„์‚ฐ๊ธฐ ํ”„๋กœ๊ทธ๋žจ์ด ์ž…๋ ฅ๋œ ์ˆ˜์‹์„ ๊ณ„์‚ฐํ•  ๋•Œ๋„ ์Šคํƒ์ด ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ“š 4.2 ์Šคํƒ์˜ ๊ตฌํ˜„

๋ฐฐ์—ด๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ํ•จ์ˆ˜์˜ ๊ตฌํ˜„

์Šคํƒํ•ญ๋ชฉ๋“ค์„ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๋ฐฐ์—ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉ. ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฆ„์„ top์ด๋ผ ํ•˜์ž. ์ด ๋ฆฌ์ŠคํŠธ๋Š” ๊ณต๋ฐฑ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

isEmpty() : ๊ณต๋ฐฑ ์ƒํƒœ ๊ฒ€์‚ฌ

def isEmpty():
	return len(top) == 0 #len(top) == 0 ์ด T/F

push(item): ์‚ฝ์ž…์—ฐ์‚ฐ
์‚ฝ์ž…์€ ์Šคํƒ์˜ ์ƒ๋‹จ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋งจ ๋’ค์„ ์Šคํƒ์˜ ์ƒ๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

def push(item):
	top.append(item)

pop(): ์‚ญ์ œ์—ฐ์‚ฐ
์‚ญ์ œ ์—ฐ์‚ฐ์€ ์Šคํƒ ์ƒ๋‹จ์— ํ•ญ๋ชฉ์„ ํ•˜๋‚˜ ๊บผ๋‚ด๊ณ  ์ด๋ฅผ ๋ฐ˜ํ™˜. ํŒŒ์ด์ฌ์€ ํ•ญ๋ชฉ์„ ๊บผ๋‚ด๋Š” pop(์œ„์น˜) ์—ฐ์‚ฐ์„ ์ œ๊ณต. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊บผ๋‚ผ ํ•ญ๋ชฉ์˜ ์œ„์น˜๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. -1์€ ๋งจ ๋’ค์˜ ํ•ญ๋ชฉ์„ ๊บผ๋‚ธ๋‹ค.

def pop(): 
    if not isEmpty(): #๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ์‚ญ์ œ๋Š” ๊ณต๋ฐฑ ๊ฒ€์‚ฌ ๊ผญ ํ•ด์ค˜!๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ
    	return top.pop(-1)

์‚ญ์ œ ์—ฐ์‚ฐ๋„ ํ•ญ์ƒ O(1)์— ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋ง‰ ์ด๋™ํ•˜๊ณ  ๊ทธ๋Ÿด ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๋‹ค. ์ต์ˆ™ํ•จ์— ์†์•„ ์†Œ์ค‘ํ•œ ๊ณต๋ฐฑ ๊ฒ€์‚ฌ๋ฅผ ์žŠ์ง€ ๋ง์ž! (๊ณผ์ œ๋‚˜ ์…ค์—์„œ ๊ฐ์ ๋„ ๊ทธ๋ ‡์ง€๋งŒ ์ฝ”๋“œ๋„,, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค)

๐Ÿ“š ๊ธฐํƒ€ ์—ฐ์‚ฐ๋“ค

๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ๋“ค๋„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„๋œ๋‹ค. peek๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด๋œ๋‹ค. ์Šคํƒ ๋‚ด์šฉ์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค. ๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ์—๋„ ๊ณต๋ฐฑ์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

def peek():	#๋งจ ์œ„์˜ ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜
    if not isEmpty():
    return top[-1]

๐Ÿ“š ๋ฐฐ์—ด ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•œ ์Šคํƒ์˜ ํด๋ž˜์Šค ๊ตฌํ˜„

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šคํƒ์ด ํ•„์š”ํ•ด์งˆ ์ˆ˜ ์žˆ๊ธฐ์— ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•ด์ฃผ์ž.

โš ๏ธ ์ฃผ์˜! โš ๏ธ

  • ์ƒ์„ฑ์ž์— ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”. ์Šคํƒ์˜ ์œ ์ผํ•œ ๋ฐ์ดํ„ฐ์ธ top์„ ๋ฆฌ์ŠคํŠธ๋กœ ์„ ์–ธ
  • ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ self๋ฅผ ์ถ”๊ฐ€
  • ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์—์„œ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ self.์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํด๋ž˜์Šค ๋‚ด์˜ ๋ณ€์ˆ˜(๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„) ๋ฐ ํ•จ์ˆ˜(๋ฉ”์†Œ๋“œ)์ž„์„ ํ‘œ์‹œํ•œ๋‹ค.
class stack
    def __init__(self): #์ƒ์„ฑ์ž
        self.top = []   #์ดˆ๊ธฐํ™”
        
    def isEmpty(self): return len(self.top) == 0 #๋น„์—ˆ๋‹น
    def size(self): return len(sel.top) #๋“ค์—ˆ๋‹น
    def clear(self) : return self.top = [] #๋‹ค์‹œ ์ดˆ๊ธฐํ™”
    
    def push(self, item):
        self.top.append(item)
        
    def pop(self):
        if not isEmpty():
    	    return self.top.pop(-1)
            
    def peek(self):
        if not isEmpty():
    	    return self.top[-1]


๐Ÿ”ฅ ์ด์ƒ ๋ชจ๋‘ ์ƒ์ˆ˜ ์‹œ๊ฐ„ ๊ฑธ๋ฆผ ๐Ÿ”ฅ 
์ดํ›„์— ์“ฐ๋ ค๋ฉด? S = stack()์ฒ˜๋Ÿผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  
for i in range(10):
	S.push(i) 
    
    ๋“ฑ์œผ๋กœ ์จ์ฃผ๋ฉด ๋จ!
            

๐Ÿ“š 4.3 ์Šคํƒ์˜ ์‘์šฉ : ๊ด„ํ˜ธ ๊ฒ€์‚ฌ

๊ด„ํ˜ธ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฑฐ๋ฆฌ์— ์žˆ๋Š” ๊ด„ํ˜ธ๋ผ๋ฆฌ ์„œ๋กœ ์Œ์„ ์ด๋ค„์•ผ ํ•จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„ ์€ ์ฑ…์—์„œ์˜ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๊ณ  ๋น„์Šทํ•œ ์˜ˆ์ œ๋กœ ๋ฐฑ์ค€์—๋„ ์žˆ์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ•ด์„œ ํ•ด๊ฒฐํ•ด๋ด„!

def checkBrackets(state):
    s = Stack()
    for ch in state:
        if ch in ('{', '[', '('):
            stack.push(ch)
        
        elif ch in ('}', ']', ')'):
             if s.isEmpty():
                return False   #๋น„์—ˆ์œผ๋ฉด ์™œํ•˜๋‹ 
        
             else:  # ๐Ÿ”ฅelse๋Š” ๋น„์–ด์žˆ์ง€ ์•Š์œผ๋ฉด์˜ ์˜๋ฏธ! ๋“ค์—ฌ์“ฐ๊ธฐ ์กฐ์‹ฌ
                 left = s.pop()
                 if (ch == '}' and left !='{') or
                 if (ch == ']' and left !='[') or
                 (ch == ')' and left !='(')   #๊ด„ํ˜ธ๊ฐ€ ์ง์ง€์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด
                 return False 
                 
         return s.isEmpty()
                

์ด๊ฑด ๋ฐฐ์šด๊ฑฐ๊ตฌ ์ด์ œ ์ ์šฉํ•ด๋ณด์ž.
์š” ๋ฌธ์ œ์ด๋‹ค

๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Parenthesis String, PS)์€ ๋‘ ๊ฐœ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ์ธ โ€˜(โ€™ ์™€ โ€˜)โ€™ ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋ฌธ์ž์—ด์ด๋‹ค. ๊ทธ ์ค‘์—์„œ ๊ด„ํ˜ธ์˜ ๋ชจ์–‘์ด ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด(Valid PS, VPS)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•œ ์Œ์˜ ๊ด„ํ˜ธ ๊ธฐํ˜ธ๋กœ ๋œ โ€œ( )โ€ ๋ฌธ์ž์—ด์€ ๊ธฐ๋ณธ VPS ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋งŒ์ผ x ๊ฐ€ VPS ๋ผ๋ฉด ์ด๊ฒƒ์„ ํ•˜๋‚˜์˜ ๊ด„ํ˜ธ์— ๋„ฃ์€ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด โ€œ(x)โ€๋„ VPS ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ VPS x ์™€ y๋ฅผ ์ ‘ํ•ฉ(concatenation)์‹œํ‚จ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด xy๋„ VPS ๊ฐ€ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด โ€œ(())()โ€์™€ โ€œ((()))โ€ ๋Š” VPS ์ด์ง€๋งŒ โ€œ(()(โ€, โ€œ(())()))โ€ , ๊ทธ๋ฆฌ๊ณ  โ€œ(()โ€ ๋Š” ๋ชจ๋‘ VPS ๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์ด๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด VPS ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ YES ์™€ NO ๋กœ ๋‚˜ํƒ€๋‚ด์–ด์•ผ ํ•œ๋‹ค.

num = int(input())
    
    for i in range(num):
        stack = [] #์ดˆ๊ธฐํ™”
        state = input() #๋ฐ›์•„์˜ค๊ธฐ
        
        for toke in state:
            if token == '(':
                stack.append (token)
                
            elif token == ')':
                 if stack:
                    stack.pop()
                
                else:
                     print("NO")
                     breack 
                     
            else:
                if not stack: print('Yes')
                else : print('NO')
                
        

์š”๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์‹ค์ œ ํ…Œ์ŠคํŠธ๋‚˜ ์ดํ›„์—๋Š” ๋ณ€์ˆ˜๋ช…์„ ์ข€ ๋” ์ถ•์•ฝํ•ด์•ผ๊ฒ ๋‹ค.


๐Ÿ“š 4.4 ์Šคํƒ์˜ ์‘์šฉ : ์ˆ˜์‹์˜ ๊ณ„์‚ฐ

def evalPost(exp):
    s = Stack()
    
    for token in exp:
        if token in "+-*/": ์—ฐ์‚ฐ์ž์— ๋“ค์–ด ์žˆ๋‹ค๋ฉด 
           val2 = s.pop() 	#ํ”ผ์—ฐ์‚ฐ์ž2
           val1 = s.pop() 	#ํ”ผ์—ฐ์‚ฐ์ž1
           
           if(token == '+'): s.push(val1 + val2) 
           elif(token == '-'): s.push(val1 - val2)
           elif(token == '*'): s.push(val1 * val2)
           elif(token == '/'): s.push(val1 / val2) 
           #์—ฐ์‚ฐ ์ˆ˜ํ–‰, ๊ฒฐ๊ณผ๋Š” ์Šคํƒ์— ๋‹ค์‹œ ์ €์žฅ
           
         else:			  #ํ•ญ๋ชฉ์ด ํ”ผ์—ฐ์‚ฐ์ž์ด๋ฉด 
             s.push(float(token)) #์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์Šคํƒ์— ์ €์žฅ
             
     return s.pop() #์ตœ์ข…๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜

๐Ÿ“š ์ค‘์œ„ํ‘œ๊ธฐ์‹์˜ ํ›„์œ„ ๋ณ€ํ™˜ ๊ตฌํ˜„

def precedence(op):
    if op == '(' or op==')' : return 0 #๊ด„ํ˜ธ๋ฅผ ๊ฐ€์žฅ ๋‚ฎ๊ฒŒ 
    elif op == '+' or op == '-' : return 1 
    elif op == '*' or op == '/' : return 2 
   	else: return -1

๋จผ์ € ์—ฐ์‚ฐ์ž๋“ค์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๋Š” ๊ด„ํ˜ธ๋Š” ์Œ“๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์•„์•ผ ํ•˜๋ฏ€๋กœ 0์„ ๋ฐ˜ํ™˜. + - ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ 1, * / ์€ ์ ค ๋†’์€ 2 ๋ถ€์—ฌ.

def Infixpost(exp):
    s = Stack()
    output = []
    
    for term in expr : 
        if term in '(':
           s.push('(') 
           
        elif term in ')':
             while not s.isEmpty():
             op = s.pop()
             if op == '(' : break;	#์™ผ์ชฝ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋„๋‚ด!
             else :
                  output.append(op)
                  
        elif term in "+-*/":			#์—ฐ์‚ฐ์ž์ด๋ฉด
             while not s.isEmpty():		#๋น„์ง€ ์•Š์•˜์„ ๋•Œ
                   op = s.peek()		#์Šคํƒ์—์„œ ๋ชจ๋‘ ๊บผ๋‚ด
                   if(precedence(term) <= precedence(op)): 
			#์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๊ฑฐ๋‚˜ ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋ฅผ
                      output.append(op)
                      s.pop()
                   else:break
              s.push(term)
          else:
              output.append(term)
              
         while not s.isEmpty():
              output.apppend(s.pop())
              
              
         return output 
     

    

0๊ฐœ์˜ ๋Œ“๊ธ€