다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
()
, []
, {}
는 모두 올바른 괄호 문자열입니다.A
가 올바른 괄호 문자열이라면, (A)
, [A]
, {A}
도 올바른 괄호 문자열입니다. 예를 들어, []
가 올바른 괄호 문자열이므로, ([])
도 올바른 괄호 문자열입니다.A
, B
가 올바른 괄호 문자열이라면, AB
도 올바른 괄호 문자열입니다. 예를 들어, {}
와 ([])
가 올바른 괄호 문자열이므로, {}([])
도 올바른 괄호 문자열입니다.대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s
가 매개변수로 주어집니다. 이 s
를 왼쪽으로 x (0 ≤ x < (s
의 길이)) 칸만큼 회전시켰을 때 s
가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0
입출력 예 설명
입출력 예 #1
x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X
입출력 예 #2
x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "[{}]()" O
5 "{}]()[" X
입출력 예 #3
입출력 예 #4
우선 괄호 문제가 나오면 스택부터 생각해야 된다는 사실을 알게 되었다. 괄호와 스택은 LIFO라는 공통점을 가지고 있기 때문에 스택을 통해 해결이 가능한 문제이다.
우선 문자열을 리스트로 만들어 주고, chk라는 변수로 True, False를 판별하도록 하였다. 리스트를 순회하며 여는 괄호가 나오면 이를 tmp라는 스택에 넣어주고 닫는 괄호가 나오면 tmp를 pop한 문자와 현재 닫는 괄호를 비교하여 짝이 맞지 않을 경우 chk를 False로 바꿔주어 카운팅되지 않게 하였다. 한번의 순회가 끝나면 슬라이싱 기법으로 리스트를 한칸씩 밀리도록 갱신해주었다.
[
, (
, {
중에 해당하면 tmp에 j를 넣어준다.]
이고 x가 [
가 아니라면 chk를 False로 갱신하고 반복문을 종료한다.)
이고 x가 (
가 아니라면 chk를 False로 갱신하고 반복문을 종료한다.}
이고 x가 {
가 아니라면 chk를 False로 갱신하고 반복문을 종료한다.def solution(s):
answer = 0
for i in range(len(s)):
s1=list(s[:])
tmp=[]
chk=True
for j in s1:
if j in ('[', '(', '{'):
tmp.append(j)
else:
if not tmp:
chk=False
break
x=tmp.pop()
if j==']' and x!='[':
chk=False
break
elif j==')' and x!='(':
chk=False
break
elif j=='}' and x!='{':
chk=False
break
if tmp:
chk=False
if chk:
answer+=1
s=s[1:]+s[0]
return answer