[Python/프로그래머스/월간 코드 챌린지 시즌2] 괄호 회전하기

문제

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

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 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
"[)(]" 9
"}}}"
0

 

나의 풀이

def isFair(s):
    if len(s) % 2 != 0 :
        return False
    stack = []
    for ch in s:
        if ch == "(" or ch == "[" or ch == "{":
            stack.append(ch)
        else:
            if len(stack) == 0:
                return False
            else :
                a = stack.pop()
                mini = a+ch
                if mini != "[]" and mini != "()" and mini != "{}":
                    return False
    return True

 

  먼저 특정 문자열이 올바른 괄호 문자열인지 아닌지를 판단하는 함수를 따로 만들었다. 이 문제는 프로그래머스 - 올바른 괄호 라는 문제의 상위 버전이라 아마 이 문제를 풀었다면 응용해서 금방 풀 수 있느니 문제이다. 먼저 문자열이 홀수라면 괄호의 짝이 무조건 맞지 않기 때문에 뒤도 안 돌아보고 False를 준다. 그 이후, 일단 문자열을 for문을 통해 하나의 괄호씩 확인했다. 이때 여는 괄호라면 배열에 저장을 한다. 만약 닫는 괄호라면 먼저 stack이 비어있는지 확인해준다. 스택이 비어있다는 뜻은 열지도 않았는데 닫는다는 의미이므로 바로 그 문자열은 옳지 않다는 것을 알 수 있다(바로 False 준다). 만약 stack이 비어있지 않은 상태라면 stack의 가장 뒤를 pop해서 옳은 괄호가 만들어진다면 넘어간다. 하지만 괄호가 만들어지지 않는다면? 예를 들면 mini가 '(]'가 된다면 그것은 잘못된 괄호이기 때문에 이때도 바로 False를 때려준다. for 문을 모두 완벽히 돌았다면 True를 준다.

 

def solution(s):
    answer = 0
    for _ in range(len(s)):
        if isFair(s) :
            answer += 1
        s = s[1:]+s[0]

    return answer

 문제를 보면 문자열 s를 왼쪽으로 한칸씩 회전하면서 옳은 문자열인지 확인을 해야 한다. 위에서 만든 함수로 올바른 괄호인지 아닌지를 먼저 확인시켜주고 문자열[0]을 계속 문자열[-1] 위치로 옮겨줘야한다. 파이썬에서 슬라이싱을 이용해 첫 문자를 제외한 문자열 + 첫 문자로 문자열을 계속 회전시켜주었다.

 

 

 

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

 

programmers.co.kr