AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • 백준
  • Python
  • level1
  • 연습문제
  • 알고리즘
  • OpenCV
  • 파이썬
  • 이코테
  • 프로그래머스
  • LEVEL2

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

알고리즘/프로그래머스

[월간 코드 챌린지 시즌2] 괄호 회전하기 - Level 2

2022. 2. 25. 10:33
 

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

 

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 해야 합니다.

 

 


✔ Solution

from collections import deque


def solution(s):
    answer = 0
    queue = deque(s)

    for i in range(len(s)):
        tmp = queue.popleft()
        queue.append(tmp)
        if check(queue) == True:
            answer += 1

    return answer


def check(queue):
    stack = []
    for c in queue:
        if c == '(' or c == '{' or c == '[':  
            stack.append(c)
        else:
            if len(stack) == 0: 
                return False
            x = stack.pop()

            if c == ')' and x != '(':
                return False
            elif c == ')' and x != '(':
                return False
            elif c == '}' and x != '{':
                return False

    return len(stack) == 0

 

⭐️ 문제 포인트

  • 괄호의 짝이 맞는지 확인하는 함수 check를 만든다.
  • deque를 이용해 왼쪽으로 돌아가는 저장공간을 만들어준다.

 

✔ Solution  2 - 다른 사람 풀이

def solution(s):
    answer = 0
    dic = {'{':'}', '[':']', '(':')'}
           
    for i in range(len(s)):
        right = list(s[i:] + s[:i])
        left = []
        while right:
            temp = right.pop(0)
            if not left:
                left.append(temp)
            else:
                if left[-1] in ['}', ')', ']']:
                    break
                    
                if dic[left[-1]] == temp:
                    left.pop()
                else:
                    left.append(temp)
        
        if not left:
            answer += 1
            
    return answer

 

  1. 비어있으면 그냥 추가해준다
  2. 비어있지않다면 left의 값이 닫힌괄호이면 break로 반복문탈출
  3. 비어있지않고 left의 값이 닫힌괄호가 아니라면 right의 맨 앞 문자열과 지울수있는지 dictionary를 통해 확인하고 지워준다. 
  4. 비어있지않고 left의 값이 닫힌괄호가 아니라면 right의 맨 앞 문자열과 지울수없다면 left배열에 추가해준다.

 

 

출처 : https://bladejun.tistory.com/123

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[2022 KAKAO BLIND] 신고 결과 받기 - Level 1  (0) 2022.02.26
[Summer/Winter Coding(~2018)] 점프와 순간 이동 - Level 2  (0) 2022.02.25
[2018 KAKAO BLIND] 파일명 정렬 - Level 2  (0) 2022.02.25
[2018 KAKAO BLIND] 캐시 - Level 2  (0) 2022.02.24
[2018 KAKAO] n진수 게임 - Level 2  (0) 2022.02.24
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바