프로그래머스/2단계

3. 올바른 괄호

js0616 2024. 3. 5. 09:48

 

문자열 s 가 ( 로 시작하여 ) 로 끝나야 한다는 뜻이다. 

그렇다고 ( )) ( 가 올바르다는것도 아니다. 

 

바로 생각나는 방법은 

 

올바른 문자열 s 의 괄호중 맨 안쪽 괄호는 결국 ()  인 문자가 나오게되며

해당 괄호를 제거하더라도 다시 () 괄호가 계속해서 1개 이상 존재하고 

마지막엔 "" 으로 남게 될것으로 예상된다. 

 

즉 반복문을 사용하여 () 를 -> "" 으로 바꾸어서 계속해서 줄여나가면 해결할수있을꺼같다.

 

def solution(s):
   
    # () 가 있으면 지우기
    while "()" in s:
        s = s.replace("()","")  
   
    # 판단
    if len(s) > 0 :
        return False

    return True

 

결과는 시간초과가 났다. 

 

() in s 가 문제인걸까 

while 의 반복 횟수가 문제인걸까 

replace 가 문제일수도있다.

 

정말 극단적으로 1개씩 지워진다고 생각하면 굉장히 많이 반복하게 되는것 같다.

 


 

2번째 방법으로는 괄호가 있는 문자열을 변형하지 않고 판단하는 방법으로 

 

( = +1 

) = -1 로 생각하는 방법이다.

 

문자열 s 를 읽으면서 해당 문자에 대해서 +1 또는 - 1을 누적하며 누적 값이 0보다 작아지는 경우 false 가 되게된다. 

 

예를 들면 

(  )  )  (  의 경우

0 -> 1 -> 0 -> -1 -> 0  과 같으며 false 가 되게 된다. 

 

def solution(s):
    count = 0
   
    for word in s:
        if word == "(" :
            count += 1
        else :
            count -= 1

        # 즉시 중단
        if count < 0 :
            return False
   
    # ( 가 더 많을 경우
    if count != 0 :
        return False

    return True