<aside> 💬 lv1, 데이터 구조

순환 큐에서의 데이터 처리

문제 설명

주어진 크기의 순환 큐를 구현하고, 제공된 일련의 데이터 처리 명령(삽입, 삭제, 탐색)을 수행하는 함수를 작성해주세요. 순환 큐는 맨 뒤에 도달하면 다시 맨 앞으로 돌아가는 특징이 있습니다. 명령은 "insert", "delete", "search"로 구성되며, 각 명령은 다음과 같이 동작합니다:

예를 들어, 큐의 크기가 3이고, 순서대로 ["insert 1", "insert 2", "insert 3", "insert 4", "search 3", "delete", "search 3"] 명령이 주어진다면, ["insert 4" 명령 후에는 큐에 [2, 3, 4]가 저장되고, "search 3"은 True, "delete" 후에는 [3, 4]가 남으며, 마지막 "search 3"은 여전히 True를 반환합니다.


제한 사항


입출력 예

크기 입력 (처리 명령) 출력 (각 명령의 결과)
3 ["insert 1", "insert 2", "insert 3", "insert 4", "search 3", "delete", "search 3"] [None, None, None, None, True, None, True]
2 ["insert A", "insert B", "insert C", "search B"] [None, None, None, True]
4 ["insert X", "delete", "search X"] [None, None, False]

입출력 설명

각 명령을 순서대로 수행한 결과를 반환합니다. "insert"와 "delete" 명령은 결과가 없으므로 None을, "search" 명령은 결과를 True 또는 False로 반환합니다.

</aside>

😺 풀이 1. 큐를 활용한 데이터 처리

from collections import deque **#1 초기 설정**

def solution(data):
    size = data["size"]
    commands = data["commands"]
    queue = deque(maxlen=size)
    result = []

    for command in commands: **#2 명령 처리**
        if command.startswith("insert"):
            _, element = command.split()
            if len(queue) == queue.maxlen:
                queue.popleft()
            queue.append(element)
            result.append(None)
        elif command == "delete":
            if queue:
                queue.popleft()
            result.append(None)
        elif command.startswith("search"):
            _, element = command.split()
            result.append(element in queue)

    return result

단계별 풀이 전략

  1. 초기 설정

    deque를 사용하여 순환 큐 queue를 초기화합니다. dequemaxlen 속성을 통해 큐의 최대 크기를 제한합니다.

    큐의 크기(size)와 명령어 리스트(commands)를 추출하고, 명령 처리 결과를 저장할 result 리스트를 초기화합니다.

  2. 명령 처리

    "insert [element]" 명령을 받으면, 큐가 가득 찬 경우 가장 오래된 요소를 자동으로 삭제하고 새 요소를 추가합니다.

    "delete" 명령을 받으면, 큐에서 가장 오래된 요소를 삭제합니다.

    "search [element]" 명령을 받으면, 요소가 큐 내에 존재하는지 확인하고 결과를 result에 추가합니다.

알아둬야 할 개념

dequemaxlen 속성

풀이 2. 큐를 활용한 데이터 처리

def solution(data):
    size = data['size'] **#1 초기 설정**
    commands = data['commands']
    q = []
    result = []

    for command in commands: **#2 명령 처리**  
        s, *i = command.split()
        if s == 'insert':
            q.append(i)
            result.append(None)
        elif s == 'search':
            if i in q:
                result.append(True)
            else:
                result.append(False)
        else:
            if q:  # 큐가 비어있는지 확인
                q.pop()
            result.append(None)
    return result

단계별 풀이 전략

  1. 초기 설정

    큐의 크기(size)와 명령어 리스트(commands)를 data 딕셔너리에서 추출합니다. 순환 큐를 일반 리스트 q로 초기화하고, 명령 처리 결과를 저장할 result 리스트를 초기화합니다.

  2. 명령 처리

    각 명령에 대해 순회하며, 명령의 종류에 따라 적절한 작업을 수행합니다.

    "insert [element]" 명령을 받으면, 요소를 q에 추가합니다. 큐의 최대 크기를 관리하는 로직이 누락되어 있습니다.

    "delete" 명령을 받으면, 큐에서 가장 오래된 요소를 삭제합니다.

    "search [element]" 명령을 받으면, 요소가 큐 내에 존재하는지 확인하고 결과를 result에 추가합니다.

알아둬야 할 개념

큐(Queue)