알고리즘

[프로그래머스 Lv2] 괄호 회전하기 (Python)

lwkejpf 2022. 8. 4. 02:29

 


 

def solution(s):
    arr = []
    answer = 0
    
    for i in s :
        arr.append(i)
    
    length = len(arr)
    if length % 2 == 1 :
        return 0
        
    for idx in range(length) :
        temp = arr[:]       # 얕은 복사 (슬라이싱)
        length = len(arr)
        
        while (True) :
            if length == 0 :
                break
            elif length == 1 :
                return 0
            else :
                if temp[0] == "(" :
                    if temp[1] == ")" :
                        del temp[0]
                        del temp[0]
                        length -= 2
                elif temp[0] == "{" :
                    if temp[1] == "}" :
                        del temp[0]
                        del temp[0]
                        length -=2
                elif temp[0] == "[" :
                    if temp[1] == "]" :
                        del temp[0]
                        del temp[0]
                        length -= 2
                else :
                    break
        if length == 0 :
            answer += 1
        arr.append(arr.pop(0))
    return answer

 

 

실행 중단은 while 문 안에서 못 빠져나와서 그냥 내가 중단시켰다

 

내가 잘못 생각한 게 '(' 다음엔 무조건 ')' 여야 하고, '{' 다음엔 '}' 일거라고만 생각해서 

 ({}) 이런 식의 괄호도 올바른 괄호인데 고려를 안 해줘서 틀린거 ㅎㅎ ..

 

어차피 맨 앞에 괄호가 맨 뒤로 가야 하니까 deque 사용하고, 

올바른 괄호인지 판단할 때는 스택 사용하면 되지 않을까 했는데

그냥 귀찮아서 arr.append(arr.pop(0)) 해준 건데 스택을 사용했어야 했다 ,,

하나하나 집어넣을 때마다 최상단 괄호랑 짝이 맞는지 확인해야 되기 때문..!!

 

 

 

 

 

from collections import deque

def solution(s):
    answer = 0
    deq = deque(s)

    for i in range(len(s)) :
        li = list(deq)
        stack = [deq[0]]
        
        for k in list(deq)[1:] :
            if len(stack) == 0 :
                stack = [k]
                continue
            if stack[-1] == '(' :
                if k == ')' :
                    deq.pop()
            elif stack[-1] == '{' :
                if k == '}' :
                    deq.pop()
            elif stack[-1] == '[' :
                if k == ']' :
                    deq.pop()
        if len(stack) == 0 :
            answer += 1
            
    	deq.append(deq.popleft()) 
    return answer

 

 

중간중간에 print 찍어보니 왜 틀렸는지 알았다

예외 처리를 하나도 안해줬다 ..&^^

 

예를 들어서 stack 최상단 괄호가 닫는 괄호라면 ??

과 같은 경우를 아예 고려  안해줘서 틀림 ㅎ

 


 

from collections import deque

def solution(s):
    answer = 0
    deq = deque(s)
    
    for i in range(len(s)) :
        stack = [deq[0]]
        
        for k in list(deq)[1:] :
            if len(stack) == 0 :
                stack = [k]
                continue
            if stack[-1] == '(' :
                if k == ')' :
                    stack.pop()
                    continue
            elif stack[-1] == '{' :
                if k == '}' :
                    stack.pop()
                    continue
            elif stack[-1] == '[' :
                if k == ']' :
                    stack.pop()
                    continue
            stack.append(k)
            
        if len(stack) == 0 :
            answer += 1
            
        deq.append(deq.popleft())
    return answer

 

stack 에 값 하나씩 넣어가면서 짝맞는 괄호인 경우에는 pop 해서 없애줬고,

짝맞는 괄호가 아니라면 다 stack 에 넣어줬다 

 

그래서 중간중간에 continue 있는 부분이 올바른 괄호 성립할 때를 의미함 !!

 

 

 

 

 

드뎌 통 과 ~~!