꾸준히 안타치기

9012 - 괄호(stack) 본문

CS/백준

9012 - 괄호(stack)

글자줍기 2022. 7. 12. 06:13
반응형

괄호 문자열(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

풀이 ( 스택 - 선입후출 )

1. 괄호 쌍으로 이루어진 문자열 입력받기 ex. ([](()[{()()[()]}()]))

2. 열린괄호는 스택에 push

3. 닫힌괄호 : 스택이 비어있지 않으면 pop. 스택이 비어있다면 짝이 안맞는 문자열

4. 위를 반복해서 최종적으로 스택이 비어있으면 (), 스택이 비어있지 않다면   (가 남은 상태로 invaild한 문자열이다.

https://wook-2124.tistory.com/442

전부다 비어야만 VPS

열린괄호는 지나감(스택에 넣어줌)

닫힌괄호를 만나면 앞에것을 확인한다. (스택 마지막것을 확인한다.비어있지않으면 pop)

짝을 이루면 터뜨림

괄호가 남아있다면 VPS가 아니다.

)( 이경우는 VPS가 아님, 예외 상황인데 생각하기 어려울것같다.

t = int(input())

for _ in range(t):
    check = input()
    ls = list(check)
    sum = 0

    for i in ls:
        if i == "(":
            sum += 1
        elif i == ")":
            sum -= 1
        if sum < 0:
            print("NO")
            break
    
    if sum > 0:
        print("NO")
    elif sum == 0:
        print("YES")

⭐️ 이게 더 직관적인것같다. 합이 0일때에만 ()가 맞는상태 

t = int(input())

for _ in range(t):
    check = input()
    ls = list(check) #괄호를 입력받아서 리스트에 넣음
    sum = 0          #합을 담을 변수

    for i in ls:     #리스트를 돌면서 i가 "(" 라면 1을 더하고
        if i == "(":
            sum += 1
        elif i == ")": #아니라면 -1
            sum -= 1
        if sum < 0:    #합이 0보다 작으면 NO
            print("NO")
            break
    
    if sum > 0:        #합이 0보다 커도 NO
        print("NO")
    elif sum == 0:     #합이 0이면 YES를 출력한다.
        print("YES")

append. 사용법(내장함수 이용)

a_list.append(1) : 괄호 안의 요소를 리스트 맨 뒤에 넣음

a_list = [1,2,3]
a_list.append(1)
=> [1,2,3,1]

a_list.pop() : 리스트의 맨 뒤에 요소를 꺼내고 리스트에서 삭제함

a_list = [1,2,3]
a_list.pop()
=> [1,2]

print(a_list.pop())
출력: 2
a_list : [1]

https://gorokke.tistory.com/129#2._%EC%82%AC%EC%9A%A9%EB%B2%95(%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98_%EC%9D%B4%EC%9A%A9) 

 

[자료구조] 파이썬 스택(stack) 총정리

1. 스택이란? : 가장 나중에 넣은 데이터를 가장 먼저 빼낼 수 있는 데이터 구조로 Last In First Out(LIFO) 방식이다. (혹은 FILO : First In Last Out) 파이썬에서는 list [] 로 이미 구현되어있다. 2. 사용법(..

gorokke.tistory.com

 

반응형

'CS > 백준' 카테고리의 다른 글

1835 - 카드(deque) 💭  (0) 2022.07.12
2164 - 카드2 ( queue, deque )  (0) 2022.07.12
13417 - 카드문자열 ☑️ (deque, Array)  (0) 2022.07.11
1302 - 베스트셀러(map) 💭  (0) 2022.07.11
3986 - 좋은단어(stack)  (0) 2022.07.11
Comments