2022 KAKAO TECH INTERNSHIP
리스트 사용
enqueue(추가)의 시간 복잡도는 O(1)이며, dequeue(삭제)는 O(N)이다. 추가의 경우는 큐의 맨 끝에서만 일어나지만, 큐의 첫번째 원소를 삭제할 경우에는 두번째 원소부터 맨 마지막 원소까지 모든 원소들의 위치를 왼쪽으로 한 칸씩 옮겨주어야하기 때문이다.
collections.deque 사용
deque(데크)는 앞과 뒤 양방향에서 데이터를 처리할 수 있는 자료구조를 의미한다. 내부적으로 doubly 링크드 리스트로 구현되어 있기 때문에 O(1)으로 매우 빠르다. 단, deque의 중간에 삽입, 제거는 더 느리다.
from collections import deque
deq = deque()
# Add element to the start
deq.appendleft(10)
# Add element to the end
deq.append(0)
# Pop element from the start
deq.popleft()
# Pop element from the end
deq.pop()
시간 초과를 고려하여 collections.deque를 사용한다.
최소 횟수를 찾기 위해서 큐의 원소 합이 큰 곳에서 작은 곳으로 이동시킨다.
from collections import deque
def solution(queue1, queue2):
answer = 0
q1 = deque(queue1)
q2 = deque(queue2)
sum1 = sum(q1)
sum2 = sum(q2)
for i in range(len(queue1) * 3):
if sum1 == sum2:
return i
elif sum1 > sum2:
num = q1.popleft()
q2.append(num)
sum1 -= num
sum2 += num
else: # sum1 < sum2
num = q2.popleft()
q1.append(num)
sum1 += num
sum2 -= num
return -1
for문 안에서 sum을 다시 쓰지 않고 num을 빼고 더하는 산술연산으로 구현한다. ➡ sum 쓰면 시간 초과
for문의 범위(반복문 탈출 조건)
def solution(que1, que2):
queSum = (sum(que1) + sum(que2))
if queSum % 2:
return -1
target = queSum // 2
n = len(que1)
start = 0
end = n - 1
ans = 0
cur = sum(que1)
que3 = que1 + que2
while cur != target:
if cur < target:
end += 1
if end == n * 2:
return -1
cur += que3[end]
else:
cur -= que3[start]
start += 1
ans += 1
return ans