<aside> 💬 lv1, 자료 구조, 데큐

데이터 저장 전략

문제 설명

정수 데이터를 처리하는 데큐가 있습니다. 이 데큐는 최대 크기가 정해져 있으며, 새로운 요소가 추가될 때마다 가장 오래된 요소가 제거됩니다. 여러 개의 데이터가 순차적으로 주어질 때, 각 단계에서 데큐의 상태를 반환하는 코드를 작성해주세요.


제한 사항


입출력 예

입력 (최대 크기, 데이터 리스트) 출력 (각 단계의 데큐)
(3, [1, 2, 3, 4, 5]) [[1], [1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5]]
(2, [7, 5, 9, 1]) [[7], [7, 5], [5, 9], [9, 1]]
(3, [3, 4, 5, 6, 3, 4, 5, 6]) [[3], [3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 3], [6, 3, 4], [3, 4, 5], [4, 5, 6]]

입출력 설명

예를 들어, 첫 번째 입력에서 최대 크기가 3인 데큐에 [1, 2, 3, 4, 5] 순으로 데이터가 주어집니다. 처음에는 [1]만 데큐에 들어갑니다. 이후 [1, 2], [1, 2, 3] 순으로 데이터가 추가됩니다. 데큐에 4가 추가될 때, 최대 크기를 초과하므로 가장 오래된 요소 1이 제거되고 [2, 3, 4]가 됩니다. 마찬가지로 5가 추가될 때는 2가 제거되어 최종적으로 [3, 4, 5]가 남습니다. 각 단계에서 데큐의 상태를 순서대로 반환합니다.

</aside>

😺 풀이 1. 데큐, 최대 길이 고정

from collections import deque **#1 데큐 함수 불러오기**

def solution(data): **#2 함수 정의**
    max_size, nums = data **#3 데이터 분리**
    dq = deque(maxlen=max_size) **#4 데큐의 최대 길이 고정**
    result = [] **#5 단계별 데큐 상태 초기화**

    for num in nums: **#6 단계 진행**
        dq.append(num) **#7 상태 갱신**
        result.append(list(dq)) **#8 현재 단계 상태 추가**

    return result **#9 각 단계의 데큐 반환**

단계별 풀이 전략

  1. 데큐 함수 불러오기

    from collections import deque를 통해 deque 함수를 불러옵니다.

  2. 함수 정의

    solution이라는 함수를 정의합니다. 이 함수는 하나의 인자 data를 받습니다. data는 각 단계의 데큐 상태를 반환하기 위한 최대 크기와 데이터 리스트입니다.

  3. 데이터 분리

    data에서 최대 크기와 데이터 리스트를 max_size, nums로 언패킹합니다.

  4. 데큐의 최대 길이 고정

    deque(max_len=max_size)를 통해 최대 크기 max_size만큼의 최대 길이 max_len을 가지는 데큐 자료형을 생성합니다. 이렇게 최대 길이가 주어진 최대 크기로 고정된 데큐를 dq에 할당합니다.

  5. 단계별 데큐 상태 초기화

    단계별 데큐의 상태를 담기 위해 result에 초깃값으로 비어있는 리스트를 할당합니다.

  6. 단계 진행

    for 문에서 데이터 리스트 nums의 데이터를 순차적으로 num에 할당할 때마다 단계가 진행됩니다.

  7. 상태 갱신

    먼저 dq.append(num)을 통해 dq에 현재 단계의 데이터 num을 추가하면서 데큐의 상태를 갱신합니다. 이때, dq 의 최대 길이는 max_size입니다.

    그러므로 만일 현재 단계에서 상태 갱신 전에 dq의 길이가 이미 max_size에 도달하였다면, 새로운 객체 num이 추가되기 전에 먼저 dq의 왼쪽 끝 데이터 하나가 제거된 후 num이 추가됩니다.

    이런 방식으로 dq의 길이를 최대 크기 max_size로 유지합니다.

  8. 현재 단계 상태 추가

    list(dq)를 통해 현재 단계의 데큐 상태를 리스트로 형변환해줍니다. result.append(list(dq))를 통해 각 단계의 데큐를 보여주는 result에 현재 단계의 데큐 상태 list(dq)를 추가합니다.

  9. 각 단계의 데큐 반환

    각 단계의 데큐 상태를 담고 있는 리스트 result를 반환함으로써, 각 단계에서 데큐의 상태를 순서대로 반환합니다.

알아둬야 할 개념

deque의 함수의 키워드 인자 maxlen

풀이 2. 조건 검사

from collections import deque **#1 데큐 함수 불러오기**

def solution(data): **#2 함수 정의**
    maximum, lst = data[0], data[1] **#3 데이터 분리**
    curr = deque() **#4 단계 데큐 초기화** 
    ret = [] **#5 단계별 데큐 상태 초기화**
    for i in lst: **#6 단계 진행**
        if len(curr) >= maximum: **#7 조건 검사**
            curr.popleft() **#8 왼쪽 끝 데이터 제거**
        curr.append(i) **#9 상태 갱신**
        ret.append(list(curr)) **#10 현재 상태 추가**
    return ret **#11 각 단계의 데큐 반환**