swexpertacademy.com/main/learn/course/lectureProblemViewer.do
※ 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 |