티스토리 뷰

● 문제 링크

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr


● 문제 설명

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

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {}  ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항

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

● 문제 해결 방향

초기 :  {, [ ( 에 대해서 dict를 사용해서 count를 해주고, 그에 적합한 짝 }, ], )이 왔을 때 count를 하나씩 깎아준다.

 

초기 아이디어의 경우 '{ [ } ]'와 같이 (A)와 같이 바깥의 괄호 안의 문자열이 올바른 괄호 문자열이 아닌 경우에도 통과로 처리해버리는 오류가 있어 다음과 같이 아이디어를 전환했다.

 

후기 : '()', '[]', '{}'를 ''로 replace 해주면서 마지막에 남은 문자열에 대해서 true, false를 판단


● 문제 해결 코드

- 초기 올바른 괄호 문자열 검증 코드

def check(s):
    if s[0] in [']', ')', "}"]:
        return False
    
    arr = {
        '[' : 0, 
        '(' : 0,
        '{' : 0
    }
    
    for i in s:
        if i in ['[', '(', '{'] :
            arr[i] += 1
        else :
            if i == ']':
                if arr['['] == 0:
                    return False
                else :
                    arr['['] -= 1
        
            if i == ')':
                if arr['('] == 0:
                    return False
                else :
                    arr['('] -= 1

            if i == '}':
                if arr['{'] == 0:
                    return False
                else :
                    arr['{'] -= 1
            
            if sum(arr.values()) != 0 :
                return False
    return True if sum(arr.values()) == 0 else False

우선 오른쪽 끝에 여는 괄호, 왼쪽 끝에 닿는 괄호가 있는 경우 -> false

여는 괄호에 대해서 dict에 카운트를 해주고, 그에 맞는 짝이 들어올 경우 dict 카운트로 깎아준다.

문자열 모두 검증 후에 dict 내 모든 value의 합이 0일 때 True를 return 한다.

중도에 여는 괄호가 들어오지 않았는데 닫는 괄호가 들어오는 경우에도 false 처리해준다.

 

이 코드의 경우 '([)]' 일 때 True를 return 해주어서 오류가 있다.

 

이후 수정한 코드

def check(s):
    if s(len) % 2 == 1 : return False
    for i in range(int(len(s) / 2)):
        s  = s.replace('()', '')
        s  = s.replace('{}', '')
        s  = s.replace('[]', '')
        if s == '':
            return True

    return True if s == '' else False


def solution(s):
    answer = 0
    for i in range(len(s)):
        if check(s) :
            answer += 1
        s = s[1:] + s[0]
    return answer

check()

문자열의 길이가 홀수인 경우 false를 리턴해준다.

그리고 반복적으로 '[]', '()', '{}'를 없애주면서 마지막에 문자열이 남지 않을 때 True를 Return 한다.

이때 반복 횟수는 괄호 1쌍의 길이가 2이기 때문에

최대 len(문자열)/2 회 돌았을 때 올바른 문자열이면 모두 괄호가 없어져야 한다고 생각한다.

 

solution()

문자열을 회전시키면서 문자열에 대해서 올바른 괄호 문자열인지 check 한다.


● 알게 된 것 / 아쉬운 점

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함