상세 컨텐츠

본문 제목

프로그래머스 / 올바른 괄호 / level2 / 파이썬

소프트웨어/자료구조 + 알고리즘

by moonionn 2021. 12. 19. 20:40

본문

 

문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

 

"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

 

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

제한사항

문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 

입출력 예

s answer
"()()" true
"(())()" true
")()(" false
"(()(" false

 

나의 풀이

스택을 활용하는 대표적인 문제 유형입니다.

비슷한 문제로는 백준의 쇠막대기 문제가 있습니다.

s에서 for문을 돌며, 여는 괄호가 나오면 stack에 element를 추가하고, 닫는 괄호가 나오면 stack에서 element를 뺍니다.

다만 이 문제는 좀 단순한 편에 속해서 굳이 data structure를 생성하지 않아도 될 것 같다는 생각을 했습니다.

그래서 스택을 구현하는 대신 count라는 integer 변수를 선언하고, 여는 괄호에 1 추가, 닫는 괄호에 1 빼기로 구현했습니다.

def solution(s):
    OPEN = '('
    CLOSE = ')'
    count = 0

    for char in s:
        if char == OPEN:
            count += 1
        if char == CLOSE:
            count -= 1
        # count값이 0보다 작아졌다는 뜻은, 이미 짝이 맞지 않는다는 뜻이므로 early return
        # ex: '())', ')(' 이런 경우
        if count < 0:
            return False

    return count == 0

 

관련글 더보기

댓글 영역