본문 바로가기

Algorithm & Data Structure

백준 - 4949번(스택, 전체탐색)

728x90
반응형
import sys
ans = []
arr = [[0]]
while 1:
    if arr[-1][0] == '.':
        break
    arr.append(sys.stdin.readline().rstrip())

for k in range(1,len(arr)-1):
    tmp = []
    for i in arr[k]:
        if i == '(' or i == '[' or i == ')' or i == ']':
            tmp.append(i)

    if '(' not in arr[k] and '[' not in arr[k] and ')' not in arr[k] and ']' not in arr[k]:
        ans.append('yes')

    x = len(tmp)

    if len(tmp) > 0:
        ##############판단 하는 부분#############
        for j in range(x):
            for i in range(len(tmp) - 1):
                if tmp[i] == '(' and tmp[i + 1] == ')':
                    tmp = tmp[:i] + tmp[i + 2:]
                    break
                elif tmp[i] == '[' and tmp[i + 1] == ']':
                    tmp = tmp[:i] + tmp[i + 2:]
                    break
        #########################################
        if len(tmp) == 0:
            ans.append('yes')
        else:
            ans.append('no')

for i in ans:
    print(i)

판단하는 부분만 부연 설명을 좀 달아보면  다음과 같다.

 

우선 입력값을 순차적으로 받고 리스트에도 순차적으로 쌓일 것이다.(스택)

나 같은 경우는 입력받은 문장에서 (,), [,]만 추출하도록 만들었다.

그렇게 해서 tmp 리스트에 넣었다.

'(' 다음에 ')' 가 오거나 '[' 다음에 ']'가 올 경우 균형이 맞게 된다.

따라서 해당 인덱스를 제거해준다.

처음 tmp번 만큼 인덱스가 제거된 리스트들을 전체 탐색을 반복하면 무조건 결과를 알 수 있다.

3중 반복문에 비효율적인 방법이긴 하지만 더 좋은 아이디어가 떠오르지 않았다.

또한 str 타입에서는 del을 사용할 수 없기 때문에 슬라이싱 해서 붙여주는 방법을 사용했다.

728x90
반응형

'Algorithm & Data Structure' 카테고리의 다른 글

백준 - 18528번(큐 구현하기)  (0) 2022.01.30
백준 - 1874번(스택)  (0) 2022.01.30
백준 - 15954번(정수론, 전체탐색)  (0) 2022.01.28
백준 - 9375번  (0) 2022.01.27
백준 - 2981번  (0) 2022.01.25