비버놀로지

[Programmers 프로그래머스] 76502 괄호 회전하기 (PYTHON) 본문

ALGORITM/PYTHON

[Programmers 프로그래머스] 76502 괄호 회전하기 (PYTHON)

KUNDUZ 2021. 7. 21. 15:58
728x90

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의 길이는 1 이상 1,000 이하입니다.

입출력 예

 

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

입출력 예 설명

입출력 예 #1

  • 다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

 

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X
  • 올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.

입출력 예 #2

  • 다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

 

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "[{}]()" O
5 "{}]()[" X
  • 올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.

입출력 예 #3

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

입출력 예 #4

  • s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.

 

먼저 입력이 되는 s를 리스트로 만들어 줍니다.

그렇게 만들어진 리스트를 활용을 해서 모든 경우를 확인을 해줍니다.

먼저 회전을 해야하기때문에 가장 왼쪽에서 하나를 뽑아서 제일 뒤에 넣어 줍니다.

이제 이 괄호가 올바른지 확인을 해줍니다.

왼쪽 괄호가 나온다면 que에 넣고, 오른쪽이 나오면 que에서 꺼내서 같은지 확인해 줍니다.

그렇게 확인을 해서 que가 비고, 모두 꺼내서 확인 했다면 answer에 1을 더해 줍니다.

def solution(s):
    answer = 0
    s_list = [i for i in s]

    for i in range(len(s_list)):
        s_list.append(s_list.pop(0))	# 가장 왼쪽 괄호를 가장 오른쪽으로
        left_que = []	# 왼쪽 괄호를 넣어준다
        cnt = len(s_list)
        for j in s_list:
            cnt -= 1
            if j == "[" or j == "(" or j == "{": # 왼쪽 괄호는 큐에 넣어준다.
                left_que.append(j)

            elif j == "}": #오른쪽일 때는 큐에서 꺼내서 확인
                if len(left_que) == 0 or left_que.pop() != "{":
                    cnt = 10
                    break
            elif j == "]":
                if len(left_que) == 0 or left_que.pop() != "[":
                    cnt = 10
                    break
            elif j == ")":
                if len(left_que) == 0 or left_que.pop() != "(":
                    cnt = 10
                    break
        if cnt == 0 and len(left_que) == 0: #큐가 비고, 끝까지 돌았다면 1
            answer += 1
    return answer

 

 

728x90
Comments