본문 바로가기
PS/programmers

[Lv. 2] 올바른 괄호(Python)

by 강렬한 스포트라이트 2023. 5. 19.

안녕하세요. 

강렬한 스포트라이트 입니다!

 

하기의 문제를 Python 언어를 사용하여 구현하고자 합니다.

 

<문제 설명>

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

예를 들어 "()()" 또는 "(())()" 는 올바른 괄호입니다. ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 

올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

<제한 사항>

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

 

<입출력 예>

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

 

<해결 코드>

 

1) "("와 ")"의 개수가 일치하지 않으면 바로 false가 되고, 일치한다면 조건 충족 여부에 따라 result 리스트에 괄호를 넣거나 빼줍니다.  cnt1의 값과 cnt2의 값이 같다는 것은 제대로 된 괄호를 의미하며 result 리스트를 초기화합니다.

이후 문자 s를 모두 탐색한 이후, result 리스트에 값이 있다는 것은 초기화되지 않았다는 것이고 이는 cnt1과 cnt2의 값이 같지 않다는 것을 의미하므로 answer의 값은 false가 됩니다.

def solution(s):
    answer=True 
    result=[]
    cnt1=0;cnt2=0 #"(" 와 ")" 의 각 개수를 담는 변수
    
    if s.count('(')!=s.count(')'):
        answer=False #개수가 다르면 false
		
    for i in range(len(s)):
        if s[i]=="(":
            result.append(s[i]) #'(' 면 result에 추가함
            cnt1+=1
        else:
            if len(result)!=0 and result[len(result)-1]=="(":
                result.pop() #앞이 '('로 ()갯수가 맞으면 리스트에서 뺀다.
            else:
                if cnt1>cnt2: #리스트 마지막이 ')'인데, '('수가 더 많으면 ')'을 추가함
                    result.append(s[i])
                    cnt2+=1
            if cnt1==cnt2:
                result=[] #두 수가 같으면 리스트 초기화
                
    if len(result):
        answer=False #두 수가 다르므로 false

    return answer

 

 

2) "("일 경우 cnt에 1을 증가하고 ")"일 경우 1을 감소하고, 이때 cnt의 값이 음수가 되는 경우에는 바로 false로 반환합니다.

이후 문자 s를 모두 탐색하면, 최종적인 cnt의 값은 0이 되는 경우에만  true로 반환합니다.

def solution(s):
    cnt=0
    for i in range(len(s)):
        if s[i] == "(":
            cnt+=1
        if s[i] == ")":
            cnt-=1
        if cnt<0:
            return False
    if cnt==0:
        return True
    else:
        return False

 

 

 

해보시고 문의사항이 있으시면 댓글로 남겨주세요.
감사합니다!

 

 

반응형
SMALL

'PS > programmers' 카테고리의 다른 글

[Lv. 2] 카펫(Python)  (0) 2023.07.11
[Lv. 2] 의상(Python)  (0) 2023.07.10
[Lv. 2] 다음 큰 숫자(Python)  (0) 2023.05.04
[Lv. 2] 최솟값 만들기(Python)  (0) 2023.05.02
[Lv. 2] JadenCase 문자열 만들기(Python)  (0) 2023.04.28