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