https://www.acmicpc.net/problem/4949
4949번: 균형잡힌 세상
하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마
www.acmicpc.net
간단해보였지만 꽤나 애먹은 문제다..
한줄씩 그 자체를 string으로 받아줬고, 한글자씩 for 처리하여 진위를 판별했다.
게 중 [ ( 가 등장한다면 리스트에 등록해줬다.
처음엔 ] ) 도 등록해줘 함께 처리하려 했는데, 일이 점점 더 많아지더라..
다른 사람들의 코드를 참고했더니 [ ( 를 리스트에 저장하고,
] ) 가 나오면 가장 마지막에 저장된 리스트 목록을 살펴 진위를 판별하는 코드가 대부분이었다.
신기한 부분은
if bal and bal[-1] == "[":
bal.pop()
였다. 「 if 리스트 : 」 은 리스트가 비어있는지 확인해주는 역할을 한다. 정말 파이썬스럽더라...
len이나 empty 사용할 생각만 했지 이런 기능이 있는지 몰랐다.
리스트[-1]은 가장 마지막에 넣어둔(마지막 목록값)을 꺼내준다.
우선 리스트에 ( 또는 [ 이 하나라도 있는지 확인해주고(안하면 오류), 있다면 마지막 애를 꺼내 부합하는지 확인해준다.
짝이 맞다면 pop처리해준다.
검사를 다 마치면 배열이 다 비었는지(모두 pop처리 됐는지) 검사를 진행해준다.
이는 앞서 nonpass 변수로 체크해줬다.
여러번 틀려가며 찾아냈는데, 마지막 검사까지 배열이 모두 비었는지 확인해주는게 중요하다.
반례 「 ()( 」 를 참고하면 이해하기 쉽다.
우여곡절 많았던 문제...! 그만큼 새로 알게 된 것들도 많다.. 나에게 파이썬은 아직 어렵다!
큐나 스택을 모두 리스트로 간단히 처리하는 것도 아직 헷갈리고 복잡하다..
아, 이 문제는 input()을 사용했다.
sys.stdin.readline으로 해봤는데, 컴마를 잡아내기가 쉽지 않았다.
sys는 한 글자를 스트링으로 입력받으면 \n까지 받아진다나 뭐라나... 무튼 개행문자 제거해주기 귀찮으니 input을 사용했다.
input은 개행을 애초에 제거해주는 멋진 아이다. 다만 느려서..
while True:
string = input()
if string == ".":
quit()
bal = []
nonpass = False
for s in string:
if s == "[" or s == "(":
bal.append(s)
elif s == "]":
if bal and bal[-1] == "[":
bal.pop()
else:
nonpass = True
break
elif s == ")":
if bal and bal[-1] == "(":
bal.pop()
else:
nonpass = True
break
if not bal and nonpass == False:
print("yes")
else:
print("no")
'[Python]BaekJoon.AC' 카테고리의 다른 글
[Python]백준 BaekJoon.AC 10828 : 스택(deque, try-except) (0) | 2022.01.24 |
---|---|
[Python]백준 BaekJoon.AC 10816 : 숫자 카드2(Counter, 이진탐색X) (0) | 2022.01.22 |
[Python]백준 BaekJoon.AC 10773 : 제로(deque) (0) | 2022.01.21 |
[Python]백준 BaekJoon.AC 9012 : 괄호(스택, 리스트) (0) | 2022.01.21 |
[Python]백준 BaekJoon.AC 2164 : 카드2(deque, queue) (0) | 2022.01.20 |
[Python]백준 BaekJoon.AC 2108 : 통계학(Counter, sum) (0) | 2022.01.20 |
[Python]백준 BaekJoon.AC 1978 : 소수 찾기(에라토스테네스의 체) (0) | 2022.01.20 |
[Python]백준 BaekJoon.AC 1920 : 수 찾기(이분탐색) (0) | 2022.01.19 |