SEO

[프로그래머스/파이썬] 올바른 괄호 본문

코딩테스트/문제 풀이

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

Crain 2024. 12. 29. 17:43
반응형

문제 설명

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

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

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

제한사항

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

입출력 예

 

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

입출력 예 설명

입출력 예 #1,2,3,4

문제의 예시와 같습니다.

 

 

 

처음 풀이 방식

  1. 문자열을 탐색하면서 “(” 일 경우 1을, “)”일 경우 -1을 배열에 넣음
  2. 이중 for 문 사용
    1. 더했을 때 0이 되는 첫번째 두 쌍의 값을 0으로 설정
  3. 배열에 있는 모든 값을 더했을 때 0이 된다면 True, 다른 값이 나온다면 False 변환
def solution(s):
    s_list = list(s)
    compare = []
    
    if s_list[0] == ")":
        return False
    
    for i in s_list:
        if (i == "("):
            compare.append(1)
        else:
            compare.append(-1)
    
    for i in range(len(compare)-1):
        for j in range(i+1, len(compare)):
            if (compare[i] + compare[j] == 0):
                compare[i] = 0
                compare[j] = 0
    
    count = 0
    for i in compare:
        count += i

    if i == 0:
        return True
    return False

정답을 맞춘 뒤 다시 코드를 살펴보니 불필요한 코드가 너무 많이 보이네요. 허허

 

 

def solution(s):
    s_list = list(s)
    count_l = 0
    count_r = 0
    
    if s_list[0] == ")":
        return False
    
    for i in s_list:
        if (i == "("):
            count_l += 1
        else:
            count_r += 1
    
    if (count_l - count_r == 0):
        return True
    return False

 

반례 : ())((()))(()

기댓값 : false

 

위와 같은 반례를 처리하기 위해 아래와 같은 풀이 방식으로 접근하였습니다.

  1. () 쌍이 생기면 pop
  2. 시작이 “)” 일 경우 false 반환 반복
def solution(s):
    s_list = list(s)
    count = 0

    for i in s_list:
        if (i == "("):
            count += 1
        else:
            count -= 1
            if count < 0:
                return False
    
    if (count == 0):
        return True
    return False

 

제출 후 채점하기 전에 추가적인 반례를 더 생각해보는 힘이 필요할 것 같습니다.

그리고 이중 for문은 되도록 사용하지 않는 방식으로 구현하도록 노력해야겠습니다. 이중 for문을 사용하는 순간 바로 O(n**2)의 복잡도가 되어버려 효율성 테스트를 통과하지 못하게 되네요.

반응형