Skip to content

Latest commit

 

History

History
51 lines (42 loc) · 2.95 KB

풀이_괄호회전하기.md

File metadata and controls

51 lines (42 loc) · 2.95 KB

🥭 프로그래머스 괄호 회전하기

  • Date : 2021.05.09(일)
  • Time : 20분

문제

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

제한사항

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



코드 풀이

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 문을 통해 하나씩 ch로 보았다. 이때 ch가 여는 괄호라면 배열에 저장을 한다. 만약 ch가 닫는 괄호라면 먼저 stack이 비어있는지 확인해준다. 스택이 비어있다는 뜻은 열지도 않았는데 닫는다는 의미이므로 바로 그 문자열은 옳지 않다는 것을 알 수 있다. 만약 stack이 비어있지 않은 상태라면 stack의 가장 뒤를 pop해서 옳은 괄호가 만들어진다면 ok! 하지만 괄호가 만들어지지 않는다면? 예를 들면 mini가 (]가 된다면 그것은 잘못된 괄호이기 때문에 이때도 바로 False를 때려준다. for 문을 모두 완벽히 돌았다면 True를 준다.

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

: s문자열을 왼쪽으로 한번씩 회전하면서 검사를 해야하기 때문에 문자열을 슬라이싱으로 회전해주었다.