본문 바로가기
코딩 테스트&알고리즘/프로그래머스 level 2

[파이썬 python] 프로그래머스 - 괄호 회전하기

by 창현2 2021. 7. 20.
  • 괄호 회전하기

문제 설명

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

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

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


제한사항

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

입출력 예

sresult

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

입출력 예 설명

입출력 예 #1

  • 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?

0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X
  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

xs를 왼쪽으로 x칸만큼 회전올바른 괄호 문자열?

0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "[{}]()" O
5 "{}]()[" X
  • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

※ 공지 - 2021년 4월 16일 테스트케이스가 추가되었습니다.


dic = {"]": "[", ")": "(", "}": "{"}


def solution(s):
    answer = 0

    cnt = 0
    while cnt != len(s):
        stack = []
        s = s[1:len(s)] + s[0]
        answer_s = True

        for c in s:
            if c == "[" or c == "(" or c == "{":
                stack.append(c)
            else:
                if len(stack) == 0:
                    answer_s = False
                    break
                if dic[c] == stack[len(stack) - 1]:
                    stack.pop()
                else:
                    answer_s = False
                    break

        if len(stack) != 0:
            answer_s = False

        if answer_s == True:
            answer += 1

        cnt += 1

    return answer

 

채점을 시작합니다.
정확성  테스트
테스트 1 〉	통과 (11.57ms, 10.2MB)
테스트 2 〉	통과 (5.82ms, 10.2MB)
테스트 3 〉	통과 (5.86ms, 10.3MB)
테스트 4 〉	통과 (9.21ms, 10.1MB)
테스트 5 〉	통과 (29.51ms, 10.2MB)
테스트 6 〉	통과 (11.62ms, 10.3MB)
테스트 7 〉	통과 (16.69ms, 10.3MB)
테스트 8 〉	통과 (19.95ms, 10.2MB)
테스트 9 〉	통과 (47.17ms, 10.3MB)
테스트 10 〉	통과 (75.65ms, 10.4MB)
테스트 11 〉	통과 (100.32ms, 10.2MB)
테스트 12 〉	통과 (0.01ms, 10.2MB)
테스트 13 〉	통과 (0.01ms, 10.2MB)
테스트 14 〉	통과 (0.01ms, 10.1MB)

후기

프로그래머스 2단계 문제다. 알맞은 괄호 확인 문제는 스택으로 풀 수 있는 문제다! 비슷한 케이스도 이것과 같이 풀 수 있다.

 

풀이

(1) s를 알맞게 슬라이싱 하여 한 개씩 회전한 새로운 s를 만든다.

(2) 새로운 s를 탐색한다. 만약 입구( "(", "[", "{" )라면 스택에 넣어준다.

(2) 입구가 아닐경우에, 출구에 알맞는 입구인지를 확인하고(딕셔너리로 미리 지정함), 맞는 출구면 스택을 pop해준다. 

     (예외 케이스로는 스택에 아무것도 없는데 pop해줄 경우, 출구와 입구가 알맞지 않은 경우)

(3) 정상적으로 입구와 출구가 있었으면 스택에는 아무것도 없다. 뭔가 있는 경우는 예외 케이스가 아니면서 입구가 많을 경우다.

(4) 앞서 다양하게 확인한 결과 맞는 괄호라면, answer += 1 해준다.

댓글