문제 출처 : [SWEA] 4866 괄호 검사
learn -> course -> programming intermediate -> stack1 -> 괄호 검사
주어진 입력에서 괄호 {}, ()가 제대로 짝을 이뤘는지 검사하는 프로그램을 만드시오.
예를 들어 {( )}는 제대로 된 짝이지만, {( })는 제대로 된 짝이 아니다. 입력은 한 줄의 파이썬 코드일수도 있고, 괄호만 주어질 수도 있다.
정상적으로 짝을 이룬 경우 1, 그렇지 않으면 0을 출력한다.
print(‘{‘) 같은 경우는 입력으로 주어지지 않으므로 고려하지 않아도 된다.
첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50
다음 줄부터 테스트 케이스 별로 온전한 형태이거나 괄호만 남긴 한 줄의 코드가 주어진다.
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
T = int(input())
for tc in range(1, T + 1):
code = input() # 문제에서 주어진 문자열
code_list = [] # 열린 괄호를 저장할 리스트
result = 1 # 결과값을 반환할 변수 초기화
# 문자열의 길이만큼 반복하는 반복문
for i in range(len(code)):
# 해당 문자열에 열린 괄호가 있으면 append
if code[i] == '(' or code[i] == '{':
code_list.append(code[i])
# 해당 문자열에 닫는 괄호가 나오면 리스트에서 pop한 값과 비교
elif code[i] == ')' or code[i] == '}':
# 이미 리스트가 비어 있을 경우 result = 0, break
if len(code_list) == 0:
result = 0
break
# pop한 값과 괄호가 일치하지 않을 경우 result = 0, break
elif code[i] == '}' and code_list.pop() == '(':
result = 0
break
elif code[i] == ')' and code_list.pop() == '{':
result = 0
break
# 리스트에 괄호가 남아있으면 result = 0
if len(code_list) != 0:
result = 0
print(f'#{tc} {result}')
print(f'#{tc} {result}')
stack에 append하고 pop하는 방식으로 푸는 문제였다. 열린 괄호가 나오면 append 해주고 닫는 괄호가 나오면 stack에서 pop한 값과 비교해서 올바른 괄호인지 판단해 주었다. 마지막에 닫는 괄호는 없는 데 열린 괄호만 있는 경우에도 올바르지 않은 경우니까 result를 0으로 바꿔주어야 한다.