https://www.acmicpc.net/problem/9012
deque
사용)from collections import deque
for _ in range(int(input())):
s = input()
stack = deque()
for c in s:
if c == "(":
stack.append(c)
elif c == ")":
if stack:
stack.pop()
else:
stack.append(c)
break
if not stack:
print("YES")
else:
print("NO")
list
사용)for _ in range(int(input())):
s = input()
stack = []
for c in s:
if c == "(":
stack.append(c)
elif c == ")":
if stack:
stack.pop()
else:
stack.append(c)
break
if not stack:
print("YES")
else:
print("NO")
stack
에 deque
대신 list
를 사용했다.deque
이 더 성능이 좋을 것 같아서 사용했는데, 제출 결과 list
가 시간, 메모리 측면에서 더 우수했다.list
가 deque
보다 우수하거나 최소 동일한 성능을 보인다고 한다. 이에 대해서는 오늘의 교훈에 적어두겠다.for _ in range(int(input())):
s = input()
cnt = 0
for c in s:
if c == "(":
cnt += 1
else:
cnt -= 1
if cnt < 0:
break
if cnt == 0:
print("YES")
else:
print("NO")
stack
변수에 괄호 문자를 저장하는 대신 cnt
변수로 (
: +1, )
: -1로 카운팅했다.list
가 deque
보다 우수하거나 최소 동일한 성능을 보인다.list
는 오른쪽 끝에서 삽입/삭제의 평균 시간복잡도가 O(1)이다.deque
은 양쪽 끝에서 삽입/삭제의 평균 시간복잡도가 O(1)이다.list
가 구현 간결성 및 실제 실행 속도 측면에서 유리한 경우가 많다.deque
는 양쪽에서 삽입/삭제가 빈번하게 일어날 때 유리하다. list
는 한쪽 끝에서만 사용하면(append, pop) 내부적으로 메모리를 한 번에 재할당할 필요가 없어 상당히 효율적이다.