카테고리 없음

[67일차][Lv2][프로그래머스][월간 코드 챌린지 시즌2][76502]괄호 회전하기

악투 2023. 10. 19. 00:35
반응형

문제 설명

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

 

제한 사항

s의 길이는 1 이상 1,000 이하입니다.

 

입출력

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

 

코드 및 설명

def solution(s):
    len_s = len(s)
    list_s = list(s)
    check_arr = []
    char_check_obj = { ']' : '[', '}' : '{', ')' : '('} 
    first_check_arr = [']', '}', ')']
    last_check_arr = ['[', '{', '(']
    count = 0
    
    for idx in range(len_s):
        if list_s[0] in first_check_arr or list_s[len_s-1] in last_check_arr:            
            pass
        else:            
            for idx2 in range(len(list_s)):
                if idx2 == 0:
                    check_arr.append(list_s[idx2])
                else:                    
                    if list_s[idx2] in last_check_arr:
                        check_arr.append(list_s[idx2])
                    else:
                        if len(check_arr) != 0 and check_arr[len(check_arr)-1] == char_check_obj[list_s[idx2]]:  
                            check_arr.pop()
                        else:
                            check_arr.append(list_s[idx2])  
                
            if len(check_arr) == 0:
                count += 1
                
            check_arr = []
                
        list_s.append(list_s[0])
        list_s.pop(0)
        
    return count

이 문제 풀다가 삽집을 너무 많이 했다... ㅎㅎ

일단 이 문제는 스택으로 풀면 되는 데, 일단 회전을 먼저 해주기 위해서 큐 방식으로 작업했다. s를 배열로 만들어주고 list_s에 담는 데 여기서 배열의 길이만큼 회전하면서 체크를 해야하기 때문에, 배열 첫번째 문자열을 내보내고, 그 문자열 다시 맨 뒤로 넣어주는 for문 생성했다.

그리고 이제 첫번째 배열의 값이 } , ),  ] 과 마지막 배열의 값이 {, (, [ 이면 올바른 괄호 문자열이 아니기 때문에 먼저 if문에 생성해주었고, 다음에선 ({)] 요런 식의 값을 체크하려면 스택에 하나씩 쌓고 만약 [ '(', '{' ] 쌓여있는 상태에서 '}' 을 만나면, 스택에 넣기전 마지막 문자열과 비교하여, 쌍을 이룰 수 있다면 pop해서 없애준다. 그걸 반복하고, check_arr에 값이 0이라면, 올바른 괄호이기때문에 count를 1 증가 시켜준다.

코드를 다 짜고 제출을 했는 데 실패가 나길래 봤더니... check_arr를 초기화를 안 시켜줘서 계속 쌓인 상태로 비교하다보니 실패가 뜬 거였다... 바로 이 부분에서 삽집을... 아 이거 뭐 참...ㅋㅋㅋ

추가 후 정상적으로 통과되었다!!!

반응형