[프로그래머스] 괄호 회전하기 - 레벨2

eternal moment·2023년 9월 21일
0

문제

2023.09.22 풀이

def solution(s):
    answer = 0
    length=len(s)
    s=s+s
    for i in range(length):
        k=s[i:i+length]
        
        arr=[]
        for j in k:
            if j =="[" or j=="(" or j=="{":
                arr.append(j)
            elif len(arr)==0:
                arr.append(0)
                break
            elif j=="]" and (arr[-1]=="["):
                arr.pop()
            elif j==")" and (arr[-1]=="("):
                arr.pop()
            elif j=="}" and (arr[-1]=="{"):
                arr.pop()
            else:
                arr.append(j)
                break
        if len(arr)==0:
            answer+=1
    return answer
  • '회전하는 괄호' 부분 구현 :
    - 반복문을 어차피 사용해야하므로 append와 pop을 반복적으로 사용하거나, 해당 i값마다 s[i:]+s[:i] 과 같은 형태로 회전된 문자열을 구현하는 방법을 생각했음.
    - 문자열 s를 두 번 겹쳐서 회전 수 만큼의 인덱스를 설정하도록 구현하였는데, 반복문 이전에서 s를 정의하는 것이 효율적인 풀이라 판단.
  • '올바른 괄호 판단' 부분 구현 :
    - 열리는 괄호는 일괄적으로 스택(arr)에 쌓아주기.
    - 닫힘괄호는 해당 괄호에 따라 스택의 가장 마지막 요소와 대칭되는 괄호인지 판단.
    - 만약 닫힘괄호일때 스택이 비어있거나 마지막 요소와 동일하지 않으면 올바르지 않은 괄호문임.
    - 스택이 비어있지않고, 마지막 요소와 동일하다면 해당 열림괄호를 스택에서 제거.
  • 테스트케이스 : "{(})" 와 같은 경우 유의하기
    - 스택이 비어있는지만 판단하느라 이러한 경우를 놓쳤었음 (테케 14번에 해당)
    - 스택의 마지막 요소가 해당 닫힘괄호와 쌍을 이루는지 확인해야함. 올바른 괄호의 조건 유의하기.


다른 풀이

  1. 유사한 백준 4949 풀이
for i in s:
        if i =="(" or i=="[":
            arr.append(i)
        elif i==")":
            if len(arr)>=1 and arr[-1]=="(":
                arr.pop()
            else:
                res='no'
                break
        elif i=="]":
            if len(arr)>=1 and arr[-1]=="[":
                arr.pop()
            else:
                res='no'
                break
    if len(arr)!=0 or res=='no':
        print('no')
    else:
        print('yes')

  1. 열림괄호 부분과 스택이 비어있지않으면서 마지막요소가 해당 닫힘괄호가 아닐때 스택에 삽입하는 풀이
def bracket(s):
        stack = []
        for i in s:
            if len(stack) == 0: stack.append(i)
            else:
                if i == ")" and stack[-1] == "(":   stack.pop()
                elif i == "]" and stack[-1] == "[":   stack.pop()
                elif i == "}" and stack[-1] == "{":   stack.pop()
                else: stack.append(i)
        return 1 if len(stack) == 0 else 0
        
def solution(s):
    answer = 0
    
    for i in range(len(s)):
        if bracket(s):  answer +=1
        s = s[1:] + s[:1]
    return answer

  1. 괄호 쌍이 붙어있으면 제거한 후 스택에 요소가 남아있는지 아닌지만으로도 판단 가능
from collections import deque

def check(s):
    while True:
        if "()" in s: s = s.replace("()","")
        elif "{}" in s: s = s.replace("{}","")
        elif "[]" in s: s = s.replace("[]","")
        else: return False if s else True       

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

    for i in range(len(s)):
        if check(''.join(queue)): count+=1
        queue.rotate(-1)
    return count

  1. 내 풀이를 좀 더 리팩토링한다면
def solution(s):
    answer = 0
    temp = list(s)
    
    for _ in range(len(s)):
 
        st = []
        for i in range(len(temp)):
            if len(st) > 0:
                if st[-1] == '[' and temp[i] == ']':
                    st.pop()
                elif st[-1] == '(' and temp[i] == ')':
                    st.pop()
                elif st[-1] == '{' and temp[i] == '}':
                    st.pop()
                else:
                    st.append(temp[i])
            else:
                st.append(temp[i])
        if len(st) == 0:
            answer += 1
        temp.append(temp.pop(0))
 
    return answer


check point

  • pop()과 remove() 헷갈리지말자.

    • pop(인덱스) : 리스트의 맨 마지막 요소를 리턴하고 그 요소는 삭제
    • remove(값) : 리스트에서 첫 번째로 나오는 x를 삭제하는 함수
    • pop() : 맨 마지막 요소 리턴 후 삭제
    • insert(a, b) : 요소 삽입 -> a번째 위치에 b를 삽입
  • 올바른 괄호가 되려면 arr의 마지막 요소가 입력받은 요소와 대칭된다는 점 유의하기.

0개의 댓글