https://www.acmicpc.net/problem/4949
내가 효율적으로 짠건지는 사실 잘 모르겠는데
내가 하는 코딩습관대로 체크플래그로 풀었다
left괄호는 플래그 1, 2
오류는 플래그 5
예제들이랑 반례들 다 통과하는데 20%쯤에서 통과가 안되서 30분정도를 애먹었는데
질문게시판에 있는 반례들이 한 6페이지까지도 다 잘 나와서 대체 뭐가 문제인지 개행문자가 문제인걸까 애를 먹고있었는데
딱 반례 '[([]])'가 no가 나와야하는데 yes가 나오는 것을 찾았다!!!
플래그로 풀었던 논리구조에 허점이 딱 있었던것이다...
그래서 괄호들만 넣는 스택 'stack'을 따로 넣어줘서 []랑 ()랑 매칭하는 논리를 추가해주니까 잘 통과했다...
문자열 문제들은 다 뭔가 노가다가 많은 것 같다ㅠㅠ 예제들은 다 통과하는데 틀릴때 반례들 다 넣으면서 찾는게 좀 힘든일이다
하지만 뭐 어쩌겠어해야지 ㅋ.ㅋ
파이썬 코드
import sys
left=["(","["]
right = [")","]"]
checka=0
checkb=0
check=0
while True:
inp = str(sys.stdin.readline().rstrip())
#inp=input()
if inp=='.':
break
stack=[]
s =list(map(str,inp.split()))
checka, checkb, check = 0,0,0
for i in s:
ss = list(i)
while len(ss)!=0:
cha = ss.pop(0)
if cha not in left and cha not in right:
continue
elif cha in left:
if cha==left[0] and checka!=-1:
checka+=1
check=1
stack.append(cha)
elif cha==left[1] and checkb!=-1:
checkb+=1
check=2
stack.append(cha)
elif cha in right:
if cha==right[0] and check!=2:
if len(stack)!=0 and stack.pop()!=left[0]:
check=5
break
else:
checka-=1
check=0
elif cha==right[1] and check!=1:
if len(stack)!=0 and stack.pop()!=left[1]:
check=5
break
else:
checkb-=1
check=0
else:
check=5
break
if check==5:
break
if checka!=0 or checkb!=0 or check==5:
print("no")
else:
print("yes")
check=0
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준/BOJ] #15961 #2535 회전초밥 [투포인터/슬라이딩윈도우/파이썬/Python] (1) | 2022.10.08 |
---|---|
[백준/BOJ]#13565:침투[DFS/그래프/깊이우선탐색/파이썬/python] (0) | 2022.06.03 |
[백준/BOJ]#2078:무한이진트리[트리/수학/파이썬/python] (0) | 2022.04.09 |
[백준/BOJ]#1406:에디터[스택/파이썬/python] (0) | 2022.04.08 |
[백준/BOJ]#15805:트리 나라 관광 가이드[트리/파이썬/python] (0) | 2022.04.08 |