문제 설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 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 |


def is_right(s):
stack = []
e_list = [']', '}', ')']
dic = {"[": "]", "{": "}", '(': ')'}
for i in s:
if len(stack) <= 0 and i in e_list:
return False
if len(stack) <= 0:
stack.append(i)
elif stack[-1] not in dic:
return False
elif i == dic[stack[-1]]:
stack.pop()
else:
stack.append(i)
if len(stack) == 0:
return True
else:
return False
def solution(s):
answer = 0
for i in range(len(s)):
if i == 0:
if is_right(s) == True:
answer += 1
else:
s = s[1:] + s[0]
if is_right(s) == True:
answer += 1
return answer
풀이
함수 하나 만들어서 string 바꿀 때마다 올바른 괄호인지 체크해주었다. 예전에 자료구조에서 스택할 때 배웠던 거랑 비슷해서 스택을 사용했다.
if len(stack) <= 0 and i in e_list:
return False
이 부분을 처음엔 안 넣고 작성했는데 그렇게 하니까 다 시간이 너무 오래 걸리는 편이라서 효율성을 좀더 높여보려고 추가해주었다. 어차피 [, {, ( 가 ], }, ) 보다 무조건 먼저 들어와야 올바른 괄호라서 빈 스택에 뒤에 세 개가 먼저면 바로 False 반환하도록 했다.
처음에 딕셔너리를 사용해서 코드를 작성했다가 리스트 인덱스를 사용하는 방법도 생각을 해봤는데 코드를 돌려보니까 효율성 면에서 크게 차이가 없길래 그냥 그대로 놔뒀다.
'코테 공부' 카테고리의 다른 글
| [파이썬] 프로그래머스 2018 KAKAO BLIND RECRUITMENT - 캐시 (0) | 2021.11.29 |
|---|---|
| [파이썬] 프로그래머스 월간 코드 챌린지1 - 이진변환 반복하기 (0) | 2021.11.28 |
| [파이썬] 프로그래머스 연습 문제 - 가운데 글자 가져오기 (0) | 2021.11.27 |
| [파이썬] 프로그래머스 월간 코드 챌린지 시즌 1 - 두 개 뽑아서 더하기 (0) | 2021.11.23 |
| [파이썬] 프로그래머스 월간 코드 챌린지 시즌1 - 3진법 뒤집기 (0) | 2021.11.22 |