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

임정민·2023년 9월 19일
1

알고리즘 문제풀이

목록 보기
104/173
post-thumbnail

프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.

문제

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

[나의 풀이]

⌛ 40분 소요


def solution(s):

    answer = 0

    from collections import deque

    s = deque(s)
    length = len(s)

    cnt = 0
    while cnt!=length:
        
        s_tmp = s.copy()
        save = ''

        while s_tmp:

            v = s_tmp.popleft()
            save += v

            try :

                if save[-2:] in ['[]','{}','()']:
                    save = save.replace(save[-2:],'')
            except:
                pass

        if save=='':
            answer += 1

        s.rotate(1)
        cnt += 1

    return answer
    

주어진 괄호 리스트를 1칸씩 돌며 올바른 괄호인지 판단하는 문제입니다. 입력되는 괄호 리스트를 queue 구조로 정의하고 rotate하는 식으로 구현하였습니다. 여는 괄호는 append하되 닫는 괄호일 때는 replace(올바른괄호,'')하여 제거하는 방식입니다. 만약 올바르지 않은 괄호 입력값일 때는 문자열이 남아
answer이 추가되지 않습니다.🐹🐹🐹

[다른사람의 풀이1]


from collections import deque

def solution(s):
    rotate = len(s)
    queue = deque(s)
    answer = 0
    
    for i in range(rotate):
        if i != 0:
            sym = queue.popleft()
            queue.append(sym)
            
        stack = []
        for q in queue:
            if stack:
                if stack[-1] == '[' and q == ']': 
                    stack.pop()
                elif stack[-1] == '{' and q == '}':
                    stack.pop()
                elif stack[-1] == '(' and q == ')':
                    stack.pop()
                else:
                    stack.append(q)
            else:
                stack.append(q)

        if len(stack) == 0:
            answer += 1

    return answer

주어지는 괄호의 표현이 [] , {} , () 세가지 밖에 안되기 때문에 단순 if 문으로 구현한 방식입니다. 최초 stack에 아무것도 없을 때는 append해주고
이후 여는 괄호 뒤에 닫는 괄호가 매칭되었을 때 pop()해주는 방식입니다.🐱🐱🐱

[다른사람의 풀이2]


def solution(s):
    answer = 0
    
    dic = {"]": "[", ")": "(", "}": "{"}

    cnt = 0
    while cnt != len(s):
        stack = []
        s = s[1:len(s)] + s[0]
        answer_s = True

        for c in s:
            if c == "[" or c == "(" or c == "{":
                stack.append(c)
            else:
                if len(stack) == 0:
                    answer_s = False
                    break
                if dic[c] == stack[len(stack) - 1]:
                    stack.pop()

        if len(stack) != 0:
            answer_s = False

        if answer_s == True:
            answer += 1

        cnt += 1

    return answer

주어진 입력값을 while문을 돌며 1번째~마지막 인덱스인 요소와 0번쨰 인덱스인 요소를 더하며 회전시키는 방식입니다. 마찬가지로 여는 괄호일 때는 append하며, 여는 괄호와 닫는 괄호가 매칭될 때 pop()하는 방식입니다.
포인트로는 닫는 괄호가 처음나왔을 때 바로 break하며 시간을 줄인 부분입니다.😺😺😺

감사합니다.

profile
https://github.com/min731

0개의 댓글