본문 바로가기
프로그래머스/lv2

[12909] 올바른 괄호 python3

반응형

문제 설명

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

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

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

제한 사항

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

입출력 예 

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

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

문제 풀이

1. for 문을 통해 open 과 close 를 카운트 한다. 

2. 만약 처음과 끝에 close가 있으면 거짓을 반환한다.

3. for 문에서 close가 더 커질 경우 예 "( ( ) ) ) ( ( ) " 중간에 닫힘기호가 더 많기 때문에 올바르지 않은 괄호이므로 거짓을 반환한다.

4. 올바른 경우 open 값과 close 값을 빼 참을 반환한다.

def solution(s):
    open =0
    close =0

    for i in range(len(s)):    
        if s[0] == ")":
            return False
        elif s[len(s) -1]  == "(":
            return False
        elif close > open :
            return False
        else:
            if s[i] == "(":
                open +=1
            else :
                close += 1
    if open - close ==0:
        print(open , close)
        return True
    else : 
        return False
    

solution("(()))(()")

 

다른 사람 문제 풀이

def is_pair(s):
    # 함수를 완성하세요
    open_cnt = 0
    for c in s:
        if c == '(':
            open_cnt += 1
        elif c == ')':
            open_cnt -= 1
            if open_cnt < 0:
                return False
    return open_cnt == 0

open_cnt 를 세면서 닫힘기호가 더 클 때 False를 반환한다. for문이 제대로 돌면 true를 반환한다.

 

 

생각 정리

처음과 끝을 비교할 필요가 없는 것을 몰랐습니다. close 카운트가 더 크면 무조건 false를 반환하면 쉬운 문제였습니다.

 

'프로그래머스 > lv2' 카테고리의 다른 글

[118667] 두 큐 합 같게 만들기 python3  (0) 2022.09.01
[42888] 오픈채팅방 python3  (0) 2022.08.29
[60057] 문자열 압축 python3  (0) 2022.08.28
[42626] 더 맵게 python3  (0) 2022.08.27
[12899] 124 나라의 숫자 python3  (0) 2022.08.24