FrontEnd
Javascript
Diary
ML
CS
Django
Algorithm
AWS
Co-Work
HTML
CSS
Python
React
ReactNative

#39 알고리즘 연습 - 올바른 괄호(Python)

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

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

제한사항

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

입출력 예

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

입출력 예 설명

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

문제풀이 주어진 문자열에서 ’(‘와 ’)‘를 count 해서 같으면 True를 출력해주면 된다
그런데 이때 주의해야할게 괄호가 제대로 안닫히 경우에도 갯수만 같으면 우리가 기대하는 것과 다르게 True로 처리해버릴수 있다는 것이다.
따라서 ’(’ 와 ’)‘를 각각 1과 -1에 대응해서 규칙을 찾아보면 기본적으로 True가 나와야 하는 속성은 0 일때고
괄호가 깨지는 순간은 0 밑으로 내려갈때 즉 ) 얘가 ( 보다 선행해서 나올때이다
이를 기반으로 if문으로 짜주면 되겠다

내 풀이 🏆

def solution(s):
    cnt = 0          #cnt 로 '('와 ')'의 갯수를 counting해주기로 한다

    for i in s:
        if i == '(':
            cnt += 1
        else:
            cnt -= 1
        if cnt < 0:       #만약 cnt 값이 0 밑으로 내려가는 것은 )가 (보다 많이 나왔다는 뜻이므로 
            return False  #괄호가 성립하지 않는다.
    if cnt == 0:          #그리고 for문이 끝난뒤에 cnt 값이 0일때만 괄호가 제대로 열리고 닫혔다는 의미이므로
        return True       #True를 리턴해준다
    return False