9012번 괄호
입력받는 문자열이 정상적힌 괄호의 형태인지 아닌지 구분하는 문제.
# 카운트를 활용한 코드 작성
for i in range(int(input())): # 테스트 케이스 개수 입력
n = input() # 문자열 입력
cnt = 0 # 카운트해줄 변수 생성
for x in n:
if x == '(': # 여는 괄호를 만나면 +1
cnt += 1
else:
cnt -= 1 # 닫는 괄호를 만나면 -1
if cnt < 0: # 만약 닫는 괄호가 더 많아서 음수가 된다면
# 정상 괄호의 형태가 아니므로 NO 출력하고 break
# 여기서 출력하는 문자의 대소문자를 확실히 확인해야 한다.
print('NO')
break
else:
if cnt == 0: # 여는 괄호와 닫는 괄호 개수가 동일하여 카운트가 0이면 YES
print('YES')
elif cnt > 0: # 닫는 괄호가 부족하면 NO
print('NO')
최근 CS 공부를 하면서 알게된 스택을 활용해 2안을 작성해 보았다.
for i in range(int(input())): # 테스트 케이스 입력
n = input() # 문자열 입력
m = [] # 스택을 활용할 빈 공간 생성
try: # 빈 리스트에서 pop하여 언더플로우가 발생 되어 error가 발생할 경우를 위해
# 예외 처리를 해주었다.
for x in n:
if x == '(': # 여는 괄호를 만나면
m.append(x) # 리스트에 스택
else:
m.pop() # 닫는 괄호를 만나면 최근에 쌓은 요소를 pop(후입선출)
if len(m) == 0: # 리스트의 길이가 0이면 괄호의 짝이 맞으므로 YES 출력
print('YES')
else:
print('NO') # 0이 아니면 NO
except IndexError: #언더플로우로 인덱스 에러 발생시
print('NO') # NO 출력