coding test

[파이썬] 4866. 괄호검사

잔망루피 2021. 1. 12. 21:39

swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.


주어진 입력에서 괄호 {}, ()가 제대로 짝을 이뤘는지 검사하는 프로그램을 만드시오.

예를 들어 {( )}는 제대로 된 짝이지만, {( })는 제대로 된 짝이 아니다. 입력은 한 줄의 파이썬 코드일수도 있고, 괄호만 주어질 수도 있다.
 

정상적으로 짝을 이룬 경우 1, 그렇지 않으면 0을 출력한다.
 

print(‘{‘) 같은 경우는 입력으로 주어지지 않으므로 고려하지 않아도 된다.


 

[입력]


첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤50
 

다음 줄부터 테스트 케이스 별로 온전한 형태이거나 괄호만 남긴 한 줄의 코드가 주어진다.

 

[출력]
 

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

입력 출력
3
print('{} {}'.format(1, 2))
N, M = map(int, input().split())
print('#{} {}'.format(tc, find())
#1 1
#2 1
#3 0

 

🎈 나의 풀이

 

T = int(input())
# 여러개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
for test_case in range(1, T + 1):
    bracket=['(', ')', '{', '}']
    str=[i for i in input() if i in bracket]	# 괄호만 골라넣기
    if str:					# 괄호가 없을 경우를 대비함.
        lst=list()
    result=0
    
    while str :
        _str=str.pop(0)
        if  _str == '(' or _str == "{" :
            lst.append(_str)
        else:
            try:	# 괄호가 짝이 맞는지 확인
                if _str == ')' and lst[-1] == '(':
                    lst.pop()    
                elif _str == '}' and lst[-1] == '{':
                    lst.pop()
                else:			# 짝이 안 맞으면 
                    break
            except:
                lst.append(0)		# 비어있는 lst에 임의로 0을 넣어서 result=0을 유지하게함.
                break
              
    if len(lst) == 0 :
        result=1
    
    print(f"#{test_case} {result}")

 

list comprehension으로 str에 괄호만 넣는다.

괄호가 하나도 없으면 str이 []이므로 lst를 만들 필요가 없다.

str에 값이 있을 동안에 while문을 반복한다.

_str이 '(' or '{'라면 리스트 lst에 추가한다.

그렇지 않다면 괄호가 짝이 맞는지 확인하고 true면 lst에 pop한다.

10개 중에 1개가 계속 실패 떠서 생각해보니 {)}와 같은 경우를 빼먹었었다.

else문을 추가해서 짝이 안 맞아서 pop을 못하면 break하게 했다.

try~except문을 사용하여 빈 리스트에서 pop하면 발생하는 에러를 처리한다. lst에 임의의 값 0을 넣고 break한다.

  

🎐 다른사람 풀이

 

TC = int(input())

for tc in range(1, TC+1):
    Data = input()
    N = len(Data)
    stack = []
    for i in range(N):
        #여는 괄호가 올 경우 => stack에 저장
        if Data[i] == "(" or Data[i] == "{":
            stack.append(Data[i])
        elif Data[i] == ")" or Data[i] == "}":
            #닫는 괄호 이며 stack이 빈 경우 => 처음부터 닫는 괄호가 오는 경우
            if len(stack) == 0:
                stack = [Data[i]]
                break
            #stack에 저장된 괄호와 일치하지 않는 경우
            elif (Data[i] == "}" and stack[-1] !="{") or (Data[i] == ")" and stack[-1] != "("):
                stack = [Data[i]]
                break
            #stack에 저장된 괄호와 일치하는 닫는 괄호가 오는 경우
            else:
                stack.pop()

    if not len(stack):
        print(f'#{tc} 1')
    else:
        print(f'#{tc} 0')

 

Data의 길이만큼 반복하면서 리스트 stack에 {, (를 추가한다.

Data에서 0인덱스에 )또는 }가 있으면 stack에 저장하고 for문을 빠져나간다.

stack의 마지막 값과 Data[i]가 짝이 안 맞으면 stack에 저장하고 for문을 빠져나간다.

괄호의 짝이 맞으면 stack에서 pop한다.

stack의 길이가 0이 아니라면 1을 출력한다.

✨새로 알게된 표현 not len(stack)

 

T = int(input())

for TC in range(1, T + 1):
    stk = []
    ans = 1
    String = str(input())
    strArr = list(String)
    for i in range(0, len(strArr)):
        if strArr[i] == '(' or strArr[i] == '{':
            stk.append(strArr[i])
        elif strArr[i] == ')' or strArr[i] == '}':
            if not stk:
                ans = 0
                break
            P = stk.pop()
            if strArr[i] == ')' and P != '(':
                ans = 0
            elif strArr[i] == '}' and P != '{':
                ans = 0
    if stk:
        ans = 0
    print("#%d %d" %(TC, ans))

 

input받은 것을 왜 str함수를 사용해서 문자열로 만든 후 String에 넣는걸까..? 안 해도 될 것 같은데

리스트 strArr의 길이만큼 반복한다.

'(' 또는 '}'라면 리스트 stk에 추가한다.

'}' 또는 ')'라면 stk에 값이 있을 때 pop한다.

stk에서 pop한 값 P와 strArr[i]이 짝이 아니라면 ans를 0으로 지정한다.

처음에 ans를 1로 초기화한 후 for문 내에서 괄호가 안 맞으면 0으로 지정하는 알고리즘.

 

 

다들 반복문 하나로 문자열 입력받고 괄호검사하네..

 

반응형

'coding test' 카테고리의 다른 글

[파이썬] 4873. 반복문자 지우기  (0) 2021.01.13
[파이썬] 4871. 그래프 경로  (0) 2021.01.13
[파이썬] 4869. 종이붙이기  (0) 2021.01.11
[파이썬] 4865. 글자수  (0) 2021.01.11
[파이썬] 4861. 회문  (0) 2021.01.08