<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>
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
초기 설정
deque
를 사용하여 순환 큐 queue
를 초기화합니다. deque
의 maxlen
속성을 통해 큐의 최대 크기를 제한합니다.
큐의 크기(size
)와 명령어 리스트(commands
)를 추출하고, 명령 처리 결과를 저장할 result
리스트를 초기화합니다.
명령 처리
"insert [element]" 명령을 받으면, 큐가 가득 찬 경우 가장 오래된 요소를 자동으로 삭제하고 새 요소를 추가합니다.
"delete" 명령을 받으면, 큐에서 가장 오래된 요소를 삭제합니다.
"search [element]" 명령을 받으면, 요소가 큐 내에 존재하는지 확인하고 결과를 result
에 추가합니다.
deque
의 maxlen
속성
기본 형태: deque_instance.maxlen
개념: collections
모듈의 deque
클래스는 양쪽 끝에서 빠르게 추가 및 삭제를 할 수 있는 큐 자료구조를 제공합니다. maxlen
속성은 deque
객체가 저장할 수 있는 최대 요소 개수를 지정합니다.
from collections import deque
d = deque(maxlen=3) # 최대 길이가 3인 deque 생성
d.append(1) # 요소 추가
d.append(2)
d.append(3)
print(d) # 출력: deque([1, 2, 3], maxlen=3)
d.append(4) # 최대 길이를 초과하는 요소 추가
print(d) # 출력: deque([2, 3, 4], maxlen=3)
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
초기 설정
큐의 크기(size
)와 명령어 리스트(commands
)를 data
딕셔너리에서 추출합니다. 순환 큐를 일반 리스트 q
로 초기화하고, 명령 처리 결과를 저장할 result
리스트를 초기화합니다.
명령 처리
각 명령에 대해 순회하며, 명령의 종류에 따라 적절한 작업을 수행합니다.
"insert [element]" 명령을 받으면, 요소를 q
에 추가합니다. 큐의 최대 크기를 관리하는 로직이 누락되어 있습니다.
"delete" 명령을 받으면, 큐에서 가장 오래된 요소를 삭제합니다.
"search [element]" 명령을 받으면, 요소가 큐 내에 존재하는지 확인하고 결과를 result
에 추가합니다.
큐(Queue)
기본 형태: from collections import deque
개념: 큐는, 먼저 들어온 데이터가 먼저 나가는, 선입선출 데이터 구조입니다. 새로운 데이터는 큐의 끝에 추가되고, 데이터를 꺼낼 때는 큐의 시작 부분에서 꺼내집니다.
from collections import deque
queue = deque() # 큐 생성
queue.append(1) # 1 추가
queue.append(2) # 2 추가
queue.append(3) # 3 추가
item = queue.pop() # 마지막 데이터인 3 꺼내기
print(item) # 출력: 3
print(queue) # 출력: deque([1, 2])