[백준]9012 괄호(python)

Ming·2022년 1월 23일
0

코테

목록 보기
7/11

백준 9012 괄호

문제

괄호 기호인 '(', ')'로만 구성되어 있는 문자열이 올바른 괄호 문자열이라면 VPS라고 부른다. 입력 받은 문자열이 VPS라면 YES를 출력하고 아니라면 NO를 출력하는 문제이다.
"(()(", ")()(", "(()" 와 같은 문자열은 VPS가 아닌 문자열이다.

구현

입력을 받을 때 input()을 이용하면 시간초과 되는 경우가 빈번하기 때문에 sys.stdin.readline()을 이용했다. 이 경우는 뒤에 개행문자까지 같이 입력받기 때문에 list에서 pop을 해주었는데 더 편리하게 .rstrip()를 이용하는 방법도 있다.

[코드설명]
입력받은 문자열을 list()를 이용하여 list에 넣어준다. 문자열 뒷부분부터 확인을 한다. ")"괄호라면 count를 1 증가 시키고 "("인 경우는 두가지 경우로 나뉜다. count가 0이라면 count를 1 증가 시키고 반복문을 종료시킨다. 그게 아니라면 count를 1 감소 시킨다.

count를 이용해서 문자열의 문법이 올바른지 파악을 한다. ")"
라면 괄호가 시작된 것이라고 판단하고 "(" 라면 괄호가 종료된 것이라고 판단을 한다. 하지만 이때 count가 0인데 "(" 이면 시작된 괄호가 없는데 괄호를 종료시킨 것이기 때문에 문법에 적합하지 않으므로 1 증가 시키고 반복문을 빠져나온다.

반복문이 종료되었을 때 count가 0이라면 VPS 이므로 YES를 출력하고 count가 0이 아니라면 NO를 출력한다.

[예시]

  • ")())"를 입력했다고 가정하자. 문자열의 뒤에서부터 확인한다.
    temp=[')', '(', ')', ')']
    temp[3]=')' count=1
    temp[2]=')' count=2
    temp[1]='(' count=1
    temp[0]=')' count=2
    count=2이므로 NO

  • ")(()())"를 입력한 경우
    temp=['(', '(', '(', ')', '(', ')', ')']
    temp[6]=')' count=1
    temp[5]=')' count=2
    temp[4]='(' count=1
    temp[3]=')' count=2
    temp[2]='(' count=1
    temp[1]='(' count=0
    count=0이고 temp[0]='('이므로 count=1
    count=1이므로 NO

[코드]

import sys
n = int(input())

for i in range(n) :
    ps = sys.stdin.readline()
    count = 0
    temp = list(ps)
    temp.pop()
    for i in range(len(temp)) :
        if temp[-1] == ")" :
            count += 1
        elif temp[-1] == "(" and count == 0:
            count+=1
            break
        else :
            count-=1
        temp.pop()

    if count == 0 :
        print("YES")
    else :
        print("NO")

0개의 댓글

관련 채용 정보