정리 노트

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

프로그래머스 코딩테스트 연습

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

꿈만 꾸는 학부생 2022. 7. 18. 15:23
728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

드디어...! 오랜만에 레벨 2 문제를 혼자 힘으로 풀어냈습니다!! 레벨 2 치고는 쉬운 문제였지만 저에게는 감격이었습니다.

저의 풀이

문자열 회전시키는 건 문자열 슬라이싱을 통해 간단하게 구현했습니다.

spinned = mystring[idx:] + mystring[:idx]

문자열 회전보다 핵심은 괄호를 체크하는 방법입니다.

저는 올바른 괄호 문자열인지 확인하기 위해 stack을 이용했습니다. 괄호 중에 왼쪽 괄호( ex. (, {, [ )는 스택에 쌓고, 오른쪽 괄호( ex. ), }, ] )는 스택에 쌓지 않고 스택의 최상단과 비교합니다. 스택의 최상단과 오른쪽 괄호가 짝이 맞으면 스택의 최상단의 괄호를 제거합니다. 만일 괄호 문자열이 올바른 문자열이었으면 스택은 비어있게 됩니다. 그러니 마지막에 스택의 길이로 이 문자열이 올바른지 아닌지 판별합니다.

이를 코드로 작성하면 아래와 같습니다.

def check_parenthenes(_s):
    stack = []
    parenthenes_pair = {")": "(", "}": "{", "]": "["}
    for prth in _s:
        if prth == "(" or prth == "{" or prth == "[":
            stack.append(prth)
        else:
            if len(stack) > 0 and stack[-1] == parenthenes_pair[prth]:
                stack.pop()
            else:
                stack.append(prth)
    return True if len(stack) == 0 else False

def solution(s):
    answer = 0
    for i in range(0, len(s)):
        spin_s = s[i:] + s[:i]
        if check_parenthenes(spin_s):
            answer += 1
    return answer

프로그래머스 채점 서버에서 확인해본 결과, 최대 148.07ms, 10.5MB만큼 소모했습니다.

다른 사람의 풀이

다른 사람의 풀이들을 보니 대부분 스택을 썼지만 문자열의 replace 함수를 이용해 풀어낸 분도 계셨습니다.

(), {}, [] 가 문자열에 있다면 이를 빈 문자열로 바꿉니다. 이를 반복하다 보면 마지막에는 빈 문자열만 남거나 "{)["와 같이 짝이 맞지 않는 문자열만 남게 됩니다. 이 풀이를 코드로 작성하면 아래와 같습니다.

# Shon-BH님의 풀이

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

이 풀이를 프로그래머스 채점 서버에서 확인해본 결과, 최대 446.48ms, 10.4MB 만큼 소모했습니다.

728x90