본문 바로가기

Minding's Programming/프로그래머스 코딩테스트

[프로그래머스 코딩테스트/Python] 올바른 괄호 문제풀이

728x90
반응형

최근 프로그래머스 데이터 엔지니어링 데브코스 지원을 계기로 코딩테스트 문제를 풀어보게 되었는데, CS 공부와 코테 풀이를 워낙 오랫동안 안하다 보니 감조차 못 잡는 느낌이 들었다. (데브코스 테스트 문제는 Lv.1~2 수준이라고 해서 나름 문제 몇 개 풀고 대비도 했는데, 생각보다 너무 어려웠다.)

 

이대로는 안된다. 오늘부터 하루 1문제씩 풀이를 해보려고 한다. 코딩도 계속 해보고 익숙해져야 느는 법이다. 오늘이 첫 날이기 때문에 간단해보이는 문제부터 시작했다.

 

문제 설명

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

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

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

 

 

문제 풀이

문제는 말 그대로 괄호가 '올바르게 짝지어서 닫혀있느냐'를 판단하는 문제다. 스택/큐를 이용하는 의도로 작성한 문제이기 때문에, stack을 이용해 문제를 풀었다.

 

stack에 해당 괄호들을 차례대로 쌓고, 닫히는 괄호( ')' )가 입력될 때는 stack에 있는 열림 괄호를 삭제시켜주는 방식으로 진행했다. 결국 모든 문자열을 순환했을 때 stack의 길이가 0이면 올바른 괄호, 아니라면 올바르지 않은 괄호일 것이다.

 

def solution(s):
    str_list = list(s) # 문자열을 리스트화
    stack = [] # stack으로 이용할 리스트
    
    for s in str_list:
        if len(stack) == 0:
            if s == ')': # stack의 제일 첫 번째에 닫히는 괄호가 오면 그걸로 올바르지 않음
                return False
            else:
                stack.append(s) # 결국 stack에는 '('만 쌓이게 된다.
                continue
        if stack[-1] != s: # ')'가 입력될 경우 stack에서 마지막 데이터를 삭제
            stack.pop()
        else:
            stack.append(s)
            
    if len(stack) == 0: # stack의 길이가 0일 때만 True를 반환
        return True
    else:
        return False
728x90