<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>

😺 풀이 1. 데큐

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 남은 요소 반환**

단계별 풀이 전략

  1. 데큐 함수 불러오기

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

  2. 함수 정의

    solution이라는 함수를 정의합니다. 이 함수는 하나의 인자 data를 받습니다. data는 처리 후 데큐를 찾은 대상이 되는 데큐와 이동 명령 리스트입니다. 이동 명령 리스트에 존재하는 이동 명령은 이동 방향과 이동 거리로 구성됩니다.

  3. 데이터 분리

    data를 데큐 deque_data, 이동 명령 리스트 commands로 언패킹합니다.

  4. 데큐 자료형 변환

    deque 함수를 이용해 deque_data의 자료형을 데큐 자료형으로 변환하고 dq에 할당합니다.

  5. 이동 명령 탐색

    for 문을 통해 이동 명령 리스트 commands의 이동 명령 command를 순차적으로 탐색합니다.

  6. 이동 명령 분리

    조건 검사를 위해 먼저 이동 명령 command를 이동 방향 direction, 이동 거리 count로 언패킹합니다.

  7. 조건 1 이동 방향이 왼쪽

    만일 이동 방향 direction의 값이 “왼쪽”과 같다면, 조건 1에 해당하는 조건문 아래 코드를 실행합니다.

  8. 데큐 처리 횟수 정의

    direction이 조건 1을 만족한 경우, 특정 횟수만큼 데큐 dq의 왼쪽 끝 요소를 제거해야 합니다. 데큐 dq를 처리할 횟수를 정의하기 위해 먼저 min 함수를 이용해 이동 거리 countdq의 길이 len(dq) 중 더 작은 값을 횟수로 정의합니다.

    그리고 구한 횟수만큼 작동하도록 for _ in range(min(count, len(dq))):과같이 for 문과 range 함수를 활용합니다.

  9. 왼쪽 끝 요소 제거

    그럼, 처리할 횟수 count 또는 len(dq)만큼 dq.popleft()가 실행되어 dq의 왼쪽 끝 요소를 정해진 횟수만큼 제거합니다.

  10. 조건 2 이동 방향이 오른쪽

    만일 이동 방향 direction의 값이 “오른쪽”과 같다면, 조건 2에 해당하는 조건문 아래 코드를 실행합니다.

  11. 데큐 처리 횟수 정의

    direction이 조건 2를 만족한 경우, 특정 횟수만큼 데큐 dq의 오른쪽 끝 요소를 제거해야 합니다. 데큐 dq를 처리할 횟수를 정의하기 위해 먼저 min 함수를 이용해 이동 거리 countdq의 길이 len(dq) 중 더 작은 값을 횟수로 정의합니다.

    그리고 구한 횟수만큼 작동하도록 for _ in range(min(count, len(dq))):과같이 for 문과 range 함수를 활용합니다.

  12. 오른쪽 끝 요소 제거

    그럼, 처리할 횟수 count 또는 len(dq)만큼 dq.pop()이 실행되어 dq의 오른쪽 끝 요소를 정해진 횟수만큼 제거합니다.

  13. 남은 요소 반환

    이동 명령을 탐색하는 과정에서 데큐 dq는 왼쪽 끝 요소 또는 오른쪽 끝 요소가 제거됩니다. 문제에서 원하는 반환 데이터의 자료형은 리스트입니다.

    그러므로 return list(dq)와 같이 list 함수를 이용해 dq에 남은 요소들을 리스트 형태로 만들어주고 반환합니다.

알아둬야 할 개념

deque 함수