<aside>
💬 lv1
, 자료 구조
, 데큐
정수 데이터를 저장하는 데큐(양방향 큐, 양쪽 끝에서 데이터 추가 가능)가 있습니다. 이 데큐에 대해 순차적으로 주어지는 일련의 이동 명령을 처리하는 코드를 작성해주세요. 이동 명령은 '왼쪽으로 N만큼 이동', '오른쪽으로 N만큼 이동'의 두 종류가 있습니다. 왼쪽으로 이동 시 데큐의 왼쪽에서 N개의 요소를 제거하고, 오른쪽으로 이동 시 데큐의 오른쪽에서 N개의 요소를 제거합니다. 모든 이동 명령을 처리한 후, 데큐에 남아 있는 요소들을 반환하세요.
입력 (데큐, 이동 명령) | 출력 (처리 후 데큐) |
---|---|
([1, 2, 3, 4, 5], [('왼쪽', 2), ('오른쪽', 1)]) | [3, 4] |
([1, 2, 3, 4, 5, 6], [('오른쪽', 3), ('왼쪽', 2)]) | [4] |
각 이동 명령에 따라 데큐의 요소를 제거하고, 최종적으로 남은 요소들을 반환합니다. 예를 들어, 첫 번째 입력에서 데큐 [1, 2, 3, 4, 5]가 주어지고, 이동 명령 ('왼쪽', 2)와 ('오른쪽', 1)이 순차적으로 주어집니다. 첫 번째 명령에서 데큐의 왼쪽 두 요소 [1, 2]가 제거되며, 데큐는 [3, 4, 5]가 됩니다. 그 다음 명령에서 데큐의 오른쪽 한 요소 [5]가 제거되어 최종적으로 [3, 4]가 남습니다. 따라서 최종 결과는 [3, 4]입니다. 각 이동 명령에 따라 데큐의 요소를 제거하고, 최종적으로 남은 요소들을 반환합니다.
</aside>
from collections import deque **#1 데큐 함수 불러오기**
def solution(data): **#2 함수 정의**
deque_data, commands = data **#3 데이터 분리**
dq = deque(deque_data) **#4 데큐 자료형 변환**
for command in commands: **#5 이동 명령 탐색**
direction, count = command **#6 이동 명령 분리**
if direction == "왼쪽": **#7 조건 1 이동 방향이 왼쪽**
for _ in range(min(count, len(dq))): **#8 데큐 처리 횟수 정의**
dq.popleft() **#9 왼쪽 끝 요소 제거**
elif direction == "오른쪽": **#10 조건 2 이동 방향이 오른쪽**
for _ in range(min(count, len(dq))): **#11 데큐 처리 횟수 정의**
dq.pop() **#12 오른쪽 끝 요소 제거**
return list(dq) **#13 남은 요소 반환**
데큐 함수 불러오기
from collections import deque
을 통해 deque
함수를 불러옵니다.
함수 정의
solution
이라는 함수를 정의합니다. 이 함수는 하나의 인자 data
를 받습니다. data
는 처리 후 데큐를 찾은 대상이 되는 데큐와 이동 명령 리스트입니다. 이동 명령 리스트에 존재하는 이동 명령은 이동 방향과 이동 거리로 구성됩니다.
데이터 분리
data
를 데큐 deque_data
, 이동 명령 리스트 commands
로 언패킹합니다.
데큐 자료형 변환
deque
함수를 이용해 deque_data
의 자료형을 데큐 자료형으로 변환하고 dq
에 할당합니다.
이동 명령 탐색
for
문을 통해 이동 명령 리스트 commands
의 이동 명령 command
를 순차적으로 탐색합니다.
이동 명령 분리
조건 검사를 위해 먼저 이동 명령 command
를 이동 방향 direction
, 이동 거리 count
로 언패킹합니다.
조건 1 이동 방향이 왼쪽
만일 이동 방향 direction
의 값이 “왼쪽”과 같다면, 조건 1에 해당하는 조건문 아래 코드를 실행합니다.
데큐 처리 횟수 정의
direction
이 조건 1을 만족한 경우, 특정 횟수만큼 데큐 dq
의 왼쪽 끝 요소를 제거해야 합니다. 데큐 dq
를 처리할 횟수를 정의하기 위해 먼저 min
함수를 이용해 이동 거리 count
와 dq
의 길이 len(dq)
중 더 작은 값을 횟수로 정의합니다.
그리고 구한 횟수만큼 작동하도록 for _ in range(min(count, len(dq))):
과같이 for
문과 range
함수를 활용합니다.
왼쪽 끝 요소 제거
그럼, 처리할 횟수 count
또는 len(dq)
만큼 dq.popleft()
가 실행되어 dq
의 왼쪽 끝 요소를 정해진 횟수만큼 제거합니다.
조건 2 이동 방향이 오른쪽
만일 이동 방향 direction
의 값이 “오른쪽”과 같다면, 조건 2에 해당하는 조건문 아래 코드를 실행합니다.
데큐 처리 횟수 정의
direction
이 조건 2를 만족한 경우, 특정 횟수만큼 데큐 dq
의 오른쪽 끝 요소를 제거해야 합니다. 데큐 dq
를 처리할 횟수를 정의하기 위해 먼저 min
함수를 이용해 이동 거리 count
와 dq
의 길이 len(dq)
중 더 작은 값을 횟수로 정의합니다.
그리고 구한 횟수만큼 작동하도록 for _ in range(min(count, len(dq))):
과같이 for
문과 range
함수를 활용합니다.
오른쪽 끝 요소 제거
그럼, 처리할 횟수 count
또는 len(dq)
만큼 dq.pop()
이 실행되어 dq
의 오른쪽 끝 요소를 정해진 횟수만큼 제거합니다.
남은 요소 반환
이동 명령을 탐색하는 과정에서 데큐 dq
는 왼쪽 끝 요소 또는 오른쪽 끝 요소가 제거됩니다. 문제에서 원하는 반환 데이터의 자료형은 리스트입니다.
그러므로 return list(dq)
와 같이 list
함수를 이용해 dq
에 남은 요소들을 리스트 형태로 만들어주고 반환합니다.
deque 함수