백준 9012 괄호 (Class 2 실버 4)

2022. 5. 1. 17:04·BOJ/Python

문제

괄호 문자열(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”를 한 줄에 하나씩 차례대로 출력해야 한다. 

 

내 제출

count = int(input())
for i in range(count) :
    stack = [] # 괄호를 넣을 stack list
    lst = input()
    lst = list(lst)
    for j in lst :
        if j == '(' :
            stack.append('(')
        elif j == ')' :
            if len(stack) != 0 and stack[-1] == '(' :
                stack.pop()
            else :
                stack.append(')')
                
    if len(stack) == 0 : # VPS임
        print("YES")
    else : 
        print("NO")

해설

count = int(input())
for i in range(count) :
    stack = [] # 괄호를 넣을 stack list
    lst = input()
    lst = list(lst)

반복할 횟수 count를 입력받는다.

count만큼 반복하여 괄호를 lst에 저장한다.

lst에는 문자열로 입력받았으나 이를 list로 바꾸어 원소를 하나씩 확인할 수 있도록 한다.

(아마 입력과 list typecasting을 한번에 할 수도 있을 것 같다.)

    for j in lst :
        if j == '(' :
            stack.append('(')
        elif j == ')' :
            if len(stack) != 0 and stack[-1] == '(' :
                stack.pop()
            else :
                stack.append(')')

입력받은 리스트를 반복문을 통해 확인한다.

만약 리스트의 원소가 '('라면 이를 스택에 추가한다. 이는 경우가 갈리지 않는다.

 

하지만 리스트의 원소가 ')'이라면

1. 스택이 비어 있지 않고, 스택의 마지막 원소가 '('라면 스택의 원소를 pop한다.

이는 '('과 ')'이 짝을 이루었기 때문에 더 이상 스택에 남아 있을 필요가 없기 때문이다.

 

2. 만약 스택이 비어 있거나 스택의 마지막 원소가 '('이 아니라면 스택에 ')'를 추가한다.

이는 스택이 비어 있을때 pop하면 에러가 나기 때문에 이미 짝이 맞지 않다는 것을 알려주기 위해 스택에 ')'를 추가하는 것이다.

위에서 스택의 마지막 원소가 '('인지 검사한 것과 같은 이치이다.

    if len(stack) == 0 : # VPS임
        print("YES")
    else : 
        print("NO")

스택이 무사히 다 짝을 찾아 pop되어서 남은 것이 없다면 VPS이기 때문에 YES를 출력한다.

그렇지 않다면 NO를 출력한다.

'BOJ/Python' 카테고리의 다른 글
  • 백준 7568 덩치 (class 2 실버 5)
  • 백준 1436 영화감독 숌 (class 2 실버5)
  • 백준 1018 체스판 다시 칠하기 (실버 5)
  • 백준 1874 스택 수열 (Class 2 실버 3)
단축키실행해보세요
단축키실행해보세요
공대생
  • 단축키실행해보세요
    Ctrl + Shift + ESC
    단축키실행해보세요
  • 전체
    오늘
    어제
    • 분류 전체보기 (170)
      • 외부 활동 (4)
      • BOJ (36)
        • Python (24)
        • C++ (12)
        • Java (0)
      • Hacking (91)
        • Crypto (4)
        • Forensics (2)
        • Mobile Hacking (5)
        • Reversing (21)
        • System (21)
        • Web Hacking (38)
      • Cloud (14)
        • Serverless (1)
        • AWS (8)
      • ML (4)
      • Data Structure (16)
      • Git (0)
      • DevOps (0)
        • Terraform (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Reflected
    c
    pwnable
    XPath
    Reversing
    bWAPP
    Systemhacking
    backjoon
    Redis
    basicrce3
    datastructure
    S3
    유석종교수님
    Dreamhack
    백준
    CodeEngn
    beebox
    AWS
    cloud
    자료구조
    EC2
    SISS
    ML
    python
    부하테스트
    SAA
    htmlinjection
    AI
    System
    acc
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
단축키실행해보세요
백준 9012 괄호 (Class 2 실버 4)
상단으로

티스토리툴바