본문 바로가기

알고리즘/프로그래머스

[프로그래머스 코딩테스트 고득점 Kit / 스택/큐] 올바른 괄호 (python)

728x90

풀이1

def solution(s):
    right_cnt = 0
    for i in s:
        if i == '(':
            right_cnt += 1
        elif i == ')':
            right_cnt -= 1
            if right_cnt < 0:
                return False
    
    return right_cnt == 0

s 배열을 앞에서부터 순회한다.

 

올바르지 않은 경우는 다음 두 가지다.

1. 앞에서부터 순회했을 때, '(' 개수보다 ')'개수가 커지는 경우

2. s 배열을 전체 다 돌았는데 '(' 개수가 더 많은 경우

 

위 두 가지 경우를 고려하여 코드를 작성했다.

'(' 괄호 개수를 right_cnt 변수에 담는다. ')'괄호가 나오면 right_cnt의 값을 1씩 줄인다.

'(' 개수보다 ')' 개수가 더 커지면 False를 리턴해야한다. (<- 올바르지 않은 괄호)

그리고 반복문을 다 돌고난 뒤에 right_cnt가 0이 아니면 올바르지 않은 괄호이므로 False를 리턴한다.

 

더보기

이전 풀이

풀이 1

def solution(s):
    answer = True

    # )로 시작하면 false
    if s[:1]==')':
        answer = False

    # (로 시작하면 )가 있어야함
    # (()()) -> True
    # ())( -> False

    else :
        cnt = 0
        for i in s:
            if i == '(':
                cnt += 1
            else:
                if cnt != 0:
                    cnt -= 1
                else:
                    answer = False
                    break
        if cnt != 0:
            answer = False

    return answer

내 풀이

cnt 변수 사용.

  • ) 로 시작하면 무조건 false
  • ( 로 시작하면 ( 개수와 ) 개수가 일치해야 true. ( 개수가 남으면 false.
  • 개수가 일치하더라도 중간에 ) 의 개수가 더 많아지는 시점이 존재하면 false. 예를 들어 "(()))(" 의 경우 false임.

 

 

풀이2

def solution(s):
    
    stack = []
    
    for i in s:
        if i == '(':
            stack.append(i)
        else:
            try:
                stack.pop()
            except IndexError:
                return False
    
    return len(stack) == 0

 

모범 답안 참고.

스택을 이용하여 풀이

  • IndexError: list index out of range 는 리스트 범위를 벗어났을 때 발생하는 에러이다. 만약 리스트에 데이터가 존재하지 않는다면 pop을 할 수 없으므로 IndexError가 발생한다.
  • 파이썬은 try catch문 대신에 try except문을 사용하여 예외처리한다.
  • stack에 ( 가 남아있는지 if문으로 따로 빼서 확인하지 않고 return 부분에서 체크하여 true 또는 false로 반환한다.
반응형