[Programmers] 괄호 회전하기 (Python3)

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|
|”[)(]”| 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인덱스와 같은 지 확인해준뒤 같으면 stack.pop(), 다르면 append() 해주면 된다.
모든 반복문이 끝난 후 스택이 비어있으면 올바른 괄호이므로 answer+=1을 해준다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from collections import deque
def solution(s):
    q = deque(s)
    answer = 0
    if len(s) == 1:
        return 0
    
    left = ['[','{','(']
    asci = {']':2,'}':2, ')':1}
    for i in range(len(s)):
        stack = []
        for j in q:
            if j in left:
                stack.append(j)
            else:
                if stack and stack[-1] == chr(ord(j)-asci[j]):
                    stack.pop()
                else:
                    stack.append(j)
        q.append(q.popleft())
        if not stack:
            answer+=1
                
    return answer
1
solution("[](){}")
1
3

카테고리:

업데이트:

댓글남기기