[프로그래머스/Lv2] 괄호 회전하기
문제
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의한다.
1. (), [], {}는 모두 올바른 괄호이다.
2. 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열이다.
3. 만약 A, B가 올바른 괄호 문자열이라면, AB도 올바른 괄호 문자열이다.
대괄호, 중괄호, 소괄호로 이루어진 문자열 s가 매개변수로 주어진다.
이 s를 왼쪽으로 x(0 <= x <= (s의 길이))칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 반환하는 함수를 만들어야 한다.
제한사항
1. s의 길이는 1 이상 1,000 이하이다.
코드
def solution(s):
def check_parenthesis(s):
if s[0] == ')' or s[0] == ']' or s[0] == '}':
return False
stack = []
for parenthesis in s:
if parenthesis == '(' or parenthesis == '[' or parenthesis == '{':
stack.append(parenthesis)
else:
if len(stack) == 0:
return False
else:
if parenthesis == ')' and stack[-1] == '(':
stack.pop()
elif parenthesis == ']' and stack[-1] == '[':
stack.pop()
elif parenthesis == '}' and stack[-1] == '{':
stack.pop()
else:
return False
return True if len(stack) == 0 else False
answer = 0
for _ in range(len(s)):
if check_parenthesis(s):
answer += 1
tmp = s[0]
s = s[1:] + tmp
return answer
설명
이전에 푼 올바른 괄호 문제를 참고하면 쉽게 풀 수 있다.
문제에서 말하는 회전은 문자열의 가장 앞 문자를 뒤에 붙여서 한 칸 씩 미는 작업이라고 생각하면 쉽게 이해된다.
우리가 해야할 일은 두가지의 기능을 구현하는 것인데,
하나는 올바른 괄호인지 판별하는 일, 다른 하나는 문자열을 회전시키는 일이다.
올바른 괄호인지 판별하는 일은 이미 한 번 만들어 봤으니 설명은 생략한다.
괄호 종류가 늘었기 때문에 원래 코드에서 조건문만 추가해주면 된다.
문자열을 회전시키는 일은 반복하면서 문자열 슬라이싱을 통해 수정해가면서 진행하면 될 것이다.
아래부터는 코드 설명이다.
def check_parenthesis(s):
if s[0] == ')' or s[0] == ']' or s[0] == '}':
return False
stack = []
for parenthesis in s:
if parenthesis == '(' or parenthesis == '[' or parenthesis == '{':
stack.append(parenthesis)
else:
if len(stack) == 0:
return False
else:
if parenthesis == ')' and stack[-1] == '(':
stack.pop()
elif parenthesis == ']' and stack[-1] == '[':
stack.pop()
elif parenthesis == '}' and stack[-1] == '{':
stack.pop()
else:
return False
return True if len(stack) == 0 else False
올바른 괄호인지를 판별하는 함수이다. 이전에 만든 올바른 괄호 판별 함수에서 달라진 것은 괄호의 종류가 늘었다는 것 말고는 없다.
answer = 0
check_parenthesis 함수에 s를 넣어 True가 반환되면 answer를 하나씩 더하는 방법으로 코드를 짤 것이다.
for _ in range(len(s)):
if check_parenthesis(s):
answer += 1
s의 길이만큼 반복, check_parenthesis에 s를 넣어 True가 반환되면 answer에 1을 더한다.
tmp = s[0]
s = s[1:] + tmp
s를 회전시키기 위해 tmp 변수에 s 문자열의 가장 첫 문자를 저장한다.
슬라이싱을 통해 첫 문자를 제외한 문자열을 만들고, 거기에 tmp를 더한다.
이 값을 s에 다시 저장한다.
return answer
반복이 종료되면 answer를 반환한다.
'코딩테스트 > 연습문제' 카테고리의 다른 글
[프로그래머스/Lv2] 위장 (0) | 2022.10.31 |
---|---|
[프로그래머스/Lv2] 튜플 (0) | 2022.10.28 |
[프로그래머스/Lv2] 행렬의 곱셈 (0) | 2022.10.27 |
[프로그래머스/Lv2] H-Index (0) | 2022.10.27 |
[프로그래머스/Lv2] [1차] 캐시 (0) | 2022.10.26 |