[프로그래머스/Lv2] 괄호 회전하기

2022. 10. 28. 11:09

문제

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의한다.

 

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를 반환한다.

BELATED ARTICLES

more