바구니 뒤집기

import sys


def main():
    input = sys.stdin.readline

    num_baskets, num_queries = map(int, input().split())

    baskets = list(range(1, num_baskets + 1))

    for _ in range(num_queries):
        i, j = map(int, input().split())
        i -= 1
        j -= 1

        baskets[i : j + 1] = reversed(baskets[i : j + 1])

    print(*baskets)


main()

reversed 함수

reversed 함수는 인자로 받은 시퀀스를 거꾸로 순회하는 이터레이터를 반환합니다.

arr = [1, 2, 3, 4, 5]
print(*reversed(arr))  # 5 4 3 2 1

리스트 슬라이싱

리스트 슬라이싱(slicing)은 리스트의 일부를 새로운 리스트로 만들어 반환합니다. 슬라이싱을 할 때는 시작 인덱스:끝 인덱스 형태로 사용합니다. 시작 인덱스는 포함되고, 끝 인덱스는 포함되지 않습니다. 시작 인덱스는 생략하면 0, 끝 인덱스는 생략하면 len(arr)가 기본값으로 사용됩니다. 인덱싱과 마찬가지로 음수 인덱스를 사용할 수 있습니다.

arr = [1, 2, 3, 4, 5]
print(arr[1:3])  # [2, 3]
print(arr[1:])   # [2, 3, 4, 5]
print(arr[-1:])  # [5]
print(arr[:3])   # [1, 2, 3]
print(arr[:-1])  # [1, 2, 3, 4]

리스트의 특정 슬라이스에 값 할당하기

대입 연산자의 왼쪽에 리스트 슬라이싱을 사용하면 해당 슬라이스에 값을 할당할 수 있습니다. 오른쪽에는 이터러블이 오면 됩니다.

arr = [1, 2, 3, 4, 5]
arr[1:3] = [10, 20]
print(arr)  # [1, 10, 20, 4, 5]

슬라이스의 길이와 이터러블의 길이가 달라도 됩니다. 마치 리스트에서 슬라이스된 부분을 없앤 후, 그 자리에 이터러블의 항목들이 들어가는 것처럼 동작합니다.

arr = [1, 2, 3, 4, 5]
arr[1:3] = [10, 20, 30, 40, 50]
print(arr)  # [1, 10, 20, 30, 40, 50, 4, 5]
댓글