문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 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
- 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.
0 | "[](){}" | O |
1 | "](){}[" | X |
2 | "(){}[]" | O |
3 | "){}[](" | X |
4 | "{}[]()" | O |
5 | "}[](){" | X |
- 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.
입출력 예 #2
- 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
0 | "}]()[{" | X |
1 | "]()[{}" | X |
2 | "()[{}]" | O |
3 | ")[{}](" | X |
4 | "[{}]()" | O |
5 | "{}]()[" | X |
- 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.
입출력 예 #3
- s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
입출력 예 #4
- s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
문제 풀이
from collections import deque
def solution(s):
queue = deque()
answer = 0
for i in range(len(s)) :
queue.append(s[i])
for i in range(len(queue)) :
t = queue.popleft()
queue.append(t)
stack = []
is_valid = True
for j in range(len(queue)) :
ch = queue[j]
if ch in ['[', '{','('] :
stack.append(ch)
else :
if len(stack) > 0 :
if ch==']' and stack[-1] == '[' :
stack.pop()
elif ch=='}' and stack[-1] == '{' :
stack.pop()
elif ch==')' and stack[-1] == '(' :
stack.pop()
else :
is_valid=False
break
else :
is_valid = False
break
if is_valid and len(stack) ==0 :
answer+=1
return answer
문자열을 회전시키기 위해 큐에 문자열을 담아줍니다.
그 후 맨 앞에 있는 문자를 pop 한 뒤 맨 뒤로 넣어줌으로써 문자열을 왼쪽으로 한 칸 회전시킵니다.
이후 회전된 문자열이 올바른 괄호 문자열인지 확인하기 위해 stack과 is_valid 변수를 선언합니다.
문자열을 순회하면서 괄호가 올바르게 닫히는지를 확인하는데
- 여는 괄호 [, {, ( 가 나올 경우, 스택에 추가합니다.
- 닫는 괄호 ], }, ) 가 나올 경우, 스택의 맨 위에 있는 괄호와 짝이 맞는지 확인하고 맞으면 스택에서 제거합니다.
- 만약 스택이 비어있거나 짝이 맞지 않는 괄호가 등장할 경우, is_valid를 False로 설정하고 검사 과정을 중단합니다.
이 과정을 마친 후:
- 올바른 괄호 문자열인 경우 → is_valid는 True이며, stack은 비어 있게 됩니다.
- 올바르지 않은 경우 → is_valid는 False이고, stack에는 닫히지 않은 괄호들이 남아 있습니다.
이렇게 회전된 문자열 중 올바른 괄호 문자열이 있을 때마다 answer를 1씩 증가시켜 최종적으로 회전된 문자열 중 올바른 괄호 문자열이 몇 개인지 계산할 수 있습니다.
'Coding Test' 카테고리의 다른 글
[ 프로그래머스 ] 연속 부분 수열 합의 개수.py (0) | 2025.04.07 |
---|---|
[프로그래머스,bfs] 게임 맵 최단거리 구하기.python (0) | 2025.04.02 |