반응형
괄호 회전하기
문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 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 해야 합니다.
문제 풀이
from collections import deque
def solution(s):
s = deque(s)
answer = 0
def galho_check(s):
left_big_galho = deque()
left_middle_galho = deque()
left_small_galho = deque()
check = True
for i in range(len(s)):
if s[i] == "[": # 대
left_big_galho.append(s[i])
check = True
elif s[i] == "{": # 중
left_middle_galho.append(s[i])
check = True
elif s[i] == "(": # 소
left_small_galho.append(s[i])
check = True
elif s[i] == "]":
if len(left_big_galho) == 0:
check = False
else:
if (s[i-1] == "{" and len(left_middle_galho) != 0) or s[i-1] == "(" and len(left_middle_galho) != 0:
check = False
else:
left_big_galho.pop()
elif s[i] == "}":
if len(left_middle_galho) == 0:
check = False
else:
if (s[i-1] == "[" and len(left_big_galho) != 0) or s[i-1] == "(" and len(left_middle_galho) != 0:
check = False
else:
check = True
left_middle_galho.pop()
elif s[i] == ")":
if len(left_small_galho) == 0:
check = False
else:
if (s[i-1] == "{" and len(left_middle_galho) != 0) or s[i-1] == "[" and len(left_big_galho) != 0:
check = False
else:
check = True
left_small_galho.pop()
if len(left_big_galho) != 0 or len(left_middle_galho) != 0 or len(left_small_galho) != 0:
check = False
if check == True:
# print(s)
return True
else:
return False
aa = galho_check(s)
if aa == True:
answer +=1
for i in range(len(s)-1):
a = s.popleft()
s.append(a)
bb = galho_check(s)
if bb == True:
answer +=1
return answer
문제 해석
deque를 사용해서 괄호 계산을 하는 문제입니다. 평소 괄호라 생각하고 풀었지만 테스트케이스 14번에서 실패하고 말았습니다. 그에 따른 예시가 '{(})' 처럼 괄호가 나오면 실패하는 과정을 봐 이에 따라 조건문을 추가하여 진행했습니다.
if (s[i-1] == "{" and len(left_middle_galho) != 0) or s[i-1] == "[" and len(left_big_galho) != 0:
위 코드와 같이 각 괄호마다 조건을 추가하여 예외처리를 진행하니 테스트케이스 14번을 통과할 수 있었습니다.
'Algorithm > programmers' 카테고리의 다른 글
프로그래머스 [level2] 할인 행사 - python3 (0) | 2023.10.27 |
---|---|
프로그래머스 [level2] n^2 배열 자르기 - python3 (0) | 2023.10.11 |
프로그래머스 [level2] 피보나치 수 - python3 (0) | 2023.10.09 |
프로그래머스 [level2] 다음 큰 숫자 - python3 (0) | 2023.09.28 |
프로그래머스 [level2] 미로 탈출 - python3 (0) | 2023.09.27 |