본문 바로가기
알고리즘/BOJ

[BOJ] 9012번 괄호 / 사용언어 : 파이썬(python)

by 바른 호랑이 2021. 12. 16.
728x90
반응형

※ 문제링크 

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

※ 기본문제

 

[BOJ] 10828번 스택 / 사용언어 : 파이썬(python)

※ 문제링크 : https://www.acmicpc.net/problem/15649 15649번: N과 M (1) 한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서

data-is-power.tistory.com

※ 문제풀이

def check(PS):
    result_list = [] # 결과확인을 위한 리스트 생성
    for i in range(len(PS)): # )이 먼저나오면 절대로 YES가 될수 없음
        if PS[0] == ')':
            return 'NO'
        else:
            for i in range(len(PS)):
                result_list.append(PS[i])
                if len(result_list) >= 2: # 괄호를 2개이상 입력받았을 때부터 확인 후 제거실시
                    if result_list[-2] + result_list[-1] == '()':
                        result_list.pop()
                        result_list.pop()
        if len(result_list) != 0:
            return 'NO'
        else:
            return 'YES'

import sys # 시간최소화를 위한 sys사용
T = int(input())
# T = int(sys.stdin.readline())
for i in range(T):
    PS = input()
    # PS = sys.stdin.readline().rstrip()   
    if i != T-1:
        sys.stdout.write(f'{check(PS)}\n') 
    else:
        sys.stdout.write(f'{check(PS)}')

 

해당문제는 스택을 활용하여 푸는 문제였다. 정상적인 VPS가 되기 위해서는 처음시작이 반드시 '('로 시작해야한다고 생각하여 ')'로 시작하는 문자열들은 추가적인 탐색을 하지않고 바로 'NO'가 출력되게끔 작성하였고, 괄호가 2개이상이 되었을 때부터는 이전에 입력받은 문자와 입력할 문자가 '()'를 이루면 리스트에서 제거되게끔 작성하였다. 문제를 풀고 채점할때까지만 해도 인지하지 못했는데 해당 코드는 사실 잘못작성된 부분이 있다. 위의 코드는 입력할 문자를 리스트에 추가후 비교하고 pop을 2번 실행하여 제거를 해주고 있는데 이렇게하면 시간과 메모리 손실이 발생하게 된다.  해당코드만으로도 통과는 되겠지만, 보다 빠르게 처리를 해주고 싶다면, 입력할 문자와 직전에 입력한 문자와 바로 비교를 하고 직전문자만 제거하는 형태로 수정하여 사용하면 될 것 같다. 그 후 최종적으로 리스트에 괄호가 있으면 'NO'를 괄호가 없으면 'YES'출력하게끔 함수를 작성하였고, 파이썬에서의 시간 단축을 위해 sys를 활용하여 출력하게끔 코드를 작성하였다.

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글