[프로그래머스] Lv2 - 괄호 회전하기

김멉덥·2023년 8월 5일
0

알고리즘 공부

목록 보기
84/171
post-thumbnail
post-custom-banner

문제

프로그래머스 월간 코드 챌린지 시즌2


코드 구현

def check_gualho(s):
    arr = []
    for i in s:
        # 여는 괄호일 때
        if(i == "[" or i == "{" or i == "("):
            arr.append(i)
        # 닫는 괄호일 때
        else:
            if(len(arr) == 0):  # 여는 괄호가 없는데 닫는 괄호가 들어오면 -> 올바른 괄호가 절대 아님
                arr = [-1]
                return arr
            # 각자 알맞게 여는 괄호가 짝지어지면 -> arr에서 pop
            if(i == "]"):
                if (arr[-1] == "["):
                    arr.pop(-1)
                else:
                    arr.append(i)
            if(i == "}"):
                if (arr[-1] == "{"):
                    arr.pop(-1)
                else:
                    arr.append(i)
            if(i == ")"):
                if (arr[-1] == "("):
                    arr.pop(-1)
                else:
                    arr.append(i)
    return arr


def solution(s):
    answer = 0

    # s를 왼쪽으로 x칸 만큼 회전 == 맨 왼쪽 괄호부터 떼어내서 오른쪽에 하나씩 붙여감
    # 올바르지 않은 괄호 : 열려있는데 닫히지 않음, 닫혀있는게 먼저 나옴

    for x in range(len(s)):
        ans_arr = check_gualho(s)   # 올바른 괄호인지 체크
        if(len(ans_arr) == 0):      # 올바른 괄호라면 리턴값의 배열 길이가 0
            answer += 1
        s = s[1:] + s[0]    # 회전

    return answer


if __name__ == '__main__':
    print(solution("[](){}"))
    print(solution("}]()[{"))
    print(solution("}}}"))
    print(solution("{(})"))
    print(solution("[({})]"))

풀이

  • 처음에는 arr 리스트의 마지막 요소와 비교하지 않고 arr 리스트의 모든 요소를 돌면서 짝이 있으면 제거하는 식으로 짰는데 이렇게 되면 14번 테스트케이스에서 오류가 난다.
    • → 따라서 찾아본 질문하기 참고자료 : https://school.programmers.co.kr/questions/43747
    • "{(})" 이런 식으로 괄호 문자열이 있으면 이것도 각자 짝을 찾아서 정답으로 처리되어 버려서 틀려버리게 된다 !
    • 따라서 탐색한 마지막 여는 괄호만 비교해주는게 맞다.
  • check_gualho() 함수로 따로 빼서 왼쪽으로 x칸 만큼 회전되는 문자열이 올바른 괄호인지 검사하도록 한다.
  • check_gualho() 함수에서는 스택처럼 괄호를 검사한다.
    • 우선 여는 괄호면 모조리 arr 리스트에 차곡히 넣는다. ( ex. ‘[’, ‘{’, ‘(’ )
    • 그 뒤로 닫는 괄호가 들어온다면, arr 리스트에서 마지막으로 들어온 괄호와 짝이 지어지는지 확인한다
      → 그 괄호와 짝이 지어지면 arr 리스트에서 제거
      → 짝이 지어지지 않으면 arr 리스트에 그대로 추가
  • arr 리스트가 온전히 비어있으면 → 올바른 괄호 문자열이므로 answer + 1
  • 다음 회전을 위해 맨 왼쪽 괄호 떼어내서 오른쪽에 붙이기

profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글