프로그래밍 문제 풀이/백준(파이썬)

[백준] 9012번: 괄호

태은코딩 2024. 4. 3. 14:20

문제

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다. 

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다. 


입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다. 

출력

출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다. 


예제입력1

6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

예제출력1

NO
NO
YES
NO
YES
NO

 


예제입력2

3
((
))
())(()

예제출력2

NO
NO
NO

문제풀이

먼저 설계를 해보자. YES가 출력되는 기준은 괄호 "(" 와 ")"의 갯수가 똑같고, ")"가 "("보다 먼저 나오면 안된다. 이를 sum=0 이라는 변수를 지정해 "("를 입력받으면 +1, ")"를 입력받으면 -1함으로써 sum이 0이면 YES를 출력하는 기준이 된다. 여기서 ")"가 "("보다 먼저 나오면 안된다는걸 충족시키기 위해 sum<0이 되면 "NO"를 출력하는 조건을 추가하자.

n=int(input())
for i in range(n):
    command=list(input())
    sum=0

먼저 입력받는 경우의 수 n을 입력받고

range(n)의 범위의 for문에 command변수에 괄호문자열을 리스트로 입력받는다.

sum=0 변수를 설정한다.

 

    for i in range(len(command)):
        if command[i]=="(":
            sum+=1
        else:
            sum-=1
        if sum<0:
            print("NO")
            break

command변수 길이만큼의 범위의 for문을 설정해

command[i]가 "("이면 sum+=1

command[i]가 ")"이면 sum-=1 을 하고

만약 if문을 실행한 뒤 sum<0이 되면 ")"가 "("보다 먼저 나왔다는 이야기니 바로 반복문을 break하고 "NO"를 출력한다.

 

    if sum>0:
        print("NO")
    elif sum==0:
        print("YES")

range(len(command)) for문을 빠져나와

sum>0 일때 "NO"를 출력하고

sum==0 이면 "YES"를 출력하고 마무리한다. 

 

 

정답

n=int(input())
for i in range(n):
    command=list(input())
    sum=0
    for i in range(len(command)):
        if command[i]=="(":
            sum+=1
        else:
            sum-=1
        if sum<0:
            print("NO")
            break
    if sum>0:
        print("NO")
    elif sum==0:
        print("YES")