관리 메뉴

커리까지

[프로그래머스] 괄호 회전하기 본문

알고리즘/풀이

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

목표는 커리 2022. 10. 5. 20:46
728x90
SMALL

문제 설명

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

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

입출력 예 설명

입출력 예 #1

  • 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.
x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X
  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
x s를 왼쪽으로 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 해야 합니다.

제출 답안

  1. while 탈출 조건은 문자열의 길이만큼 돌면 탈출한다.
    1. for 문으로 할 때보다 while문으로 loop를 하는게 더 빨랐다.
  2. s는 copy_s에 다시 할당한다.
  3. cpoy_s에서 괄호에 해당하는 문자들은 ""로 변경한다.
    1. 이 횟수는 문자열의 1/2배만큼 하면 된다.
    2. 예를 들어 {{{}}} 라고 하면 문자열은 6이고 최대 3만 돌면 모든 문자가 공백으로 치환되기에 1/2까지만 돌면 된다.
  4. 만약 copy_s가 비었으면 answer에 1을 더한다.
  5. 그 다음에 원래 문자열 s를 왼쪽으로 돌린다.
from collections import deque

def solution(s):
    answer = 0
    break_cnt = len(s)
    while 0 < break_cnt:
        copy_s = s
        for _ in range(int(len(s) / 2)):
            copy_s = copy_s.replace("[]", "")
            copy_s = copy_s.replace("{}", "")
            copy_s = copy_s.replace("()", "")
        if not copy_s:
            answer += 1
        s = deque(s)
        s.rotate(-1)
        s = ''.join(s)
        break_cnt -= 1
    return answer
테스트 1 〉 통과 (470.85ms, 10.1MB)
테스트 2 〉 통과 (271.25ms, 10.1MB)
테스트 3 〉 통과 (147.19ms, 10.3MB)
테스트 4 〉 통과 (134.32ms, 10.3MB)
테스트 5 〉 통과 (134.38ms, 10.1MB)
테스트 6 〉 통과 (185.91ms, 10.1MB)
테스트 7 〉 통과 (152.77ms, 10.3MB)
테스트 8 〉 통과 (164.78ms, 10.4MB)
테스트 9 〉 통과 (129.42ms, 10.3MB)
테스트 10 〉 통과 (151.36ms, 10.3MB)
테스트 11 〉 통과 (133.69ms, 10.2MB)
테스트 12 〉 통과 (0.01ms, 10.1MB)
테스트 13 〉 통과 (0.02ms, 10.2MB)
테스트 14 〉 통과 (0.02ms, 10.3MB)
728x90
LIST
Comments