스토리지

프로그래머스 76502 - 괄호 회전하기 본문

알고리즘

프로그래머스 76502 - 괄호 회전하기

ljw4104 2021. 10. 5. 13:57

https://programmers.co.kr/learn/courses/30/lessons/76502

 

코딩테스트 연습 - 괄호 회전하기

 

programmers.co.kr

문제 설명

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

  • (), [], {} 는 모두 올바른 괄호 문자열입니다.
  • 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
  • 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {}  ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

 

입출력 예

s result
"[](){}" 3
"}]()[{" 2
"[)(]" 0
"}}}" 0

문제 풀이

문제에서 묻고자 하는 것

  1. 문자열을 회전할 수 있는지?
  2. 이 괄호가 올바른 괄호들의 집합인지?

1번은 단순히 문자열을 이용하여 할 수 있고, 2번은 스택을 사용하여 풀 수 있다.

 

올바른 괄호 문자열인지 확인 하는 법

  1. 여는 괄호 ( '(', '{' '[' ) 가 나오면 스택에 push 한다.
  2. 스택의 top에 있는 원소가 닫는 괄호 ( ')' '}' ']' ) 와 같은 쌍을 이루는 괄호면 pop 한다.
  3. 모든 과정이 끝났을 때 스택이 비어있으면 올바른 괄호 문자열, 아니면 올바르지 않은 괄호 문자열이다

3번 과정에서 한 가지 빼먹을 수 있는게 여는 괄호가 하나도 안나오고 닫는 괄호로만 구성된 문자열이 입력으로 주어질 경우에는 올바른 괄호 문자열이라고 반환하는 문제가 생긴다.

그러므로 3번 과정을 체크할 때, 1번을 거쳤나? 라는 조건을 하나 추가해주면 해결이 된다.

 

def check(s):
    isSet = False
    stack = []
    for i in s:
        if i == '[' or i == '(' or i == '{':
            isSet = True
            stack.append(i)
        if not stack:
            continue
        elif (i == ']' and stack[len(stack) - 1] == '[') or (i == '}' and stack[len(stack) - 1] == '{') or (i == ')' and stack[len(stack) - 1] == '('):
            stack.pop()
    if not stack and isSet:
        return True
    return False


def solution(s):
    answer = 0

    for i in range(len(s)):
        if check(s):
            answer += 1
        first = s[0]
        s = s[1:len(s)] + first

    return answer

다른 언어였으면 이보다 더 쉽게 풀었을 것 같다.

Python의 문자열이 건들기 좀 귀찮아서 거기서 잠깐 막혔던 문제

Comments