728x90
반응형
<문제>
<소스코드>
while True:
s = input()
if s == '.':
break
tmp = []
result = True
for j in s:
if j == "(" or j == "[":
tmp.append(j)
elif j == ")":
if not tmp or tmp[-1] == "[":
result = False
break
elif tmp[-1] == "(":
tmp.pop()
elif j == "]":
if not tmp or tmp[-1] == "(":
result = False
break
elif tmp[-1] == "[":
tmp.pop()
if not tmp and result == True:
print("yes")
else:
print("no")
<NOTE>
1. 입력의 개수가 주어지지 않고 입력의 종료조건이 주어졌을때 반복문
while True를 통해 무한루프를 돌려 종료조건에 해당하면 break로 종료한다.
while True
while 1이나 while "hello"와 같은 0이아닌 숫자나 내용이있는 문자열도 True로 취급하여 무한루프로 동작한다
while 1
while "hello"
2. Solution
( )과 [ ]의 균형을 맞추기 위해 기본 아이디어는 문자열 s내에서 "(" 또는 "["이 나오면 빈 리스트 tmp에 넣고, ")" 또는 "]"이 나오면 리스트에서 각각 "("과 "["을 제거하는 것이다. 여기서 ")" 또는 "]"이 나오면 첫번째로 나온 것이 아닌지 체크해야하고, tmp에 마지막으로 들어간 것이 각 기호와 균형을 이루는 기호인지를 체크해야한다. 그것을 체크하는 코드는 아래와 같다.
elif j == ")":
if not tmp or tmp[-1] == "[":
result = False
break
elif j == "]":
if not tmp or tmp[-1] == "(":
result = False
break
result를 True로 초기화하고, 위의 두 곳에서 result를 False로 두는 이유는 그냥 break를 하면 최종적으로 결론을 내릴 때, tmp가 비어있는 것이 균형이 잡힌 문자열이라서 비어있는 것인지 아니면 균형이 맞지 않아 break를 걸어서 비어있는 것인지 구분할 수 없다. 따라서 result로 구분을 해준 후, 최종적으로 tmp가 비어있으면서 result == True인 경우 "yes"를 출력하고, 그 이외에는 "no"를 출력한다.
728x90
반응형
'알고리즘 > 스택 \ 큐 \ 덱' 카테고리의 다른 글
#12 [파이썬] 백준 7785번 문제: 회사에 있는 사람 (0) | 2021.04.13 |
---|---|
#11 [파이썬] 백준 2841번 문제: 외계인의 기타 연주 (0) | 2021.04.13 |
#9 [파이썬] 백준 9012번 문제: 괄호 (0) | 2021.04.07 |
#8 [파이썬] 백준 10845번 문제: 큐 (0) | 2021.04.07 |
#7 [파이썬] 백준 10828번 문제: 스택 (0) | 2021.04.06 |
댓글