[파이썬] 백준 10804 : 카드 역배치

asaei623·2023년 2월 2일
0

[Algorithm] 정렬

목록 보기
5/6

백준 10804 : 카드 역배치 바로가기

이 문제는 문제의 이름처럼 카드를 역배치해야 한다.

역배치 방법은 두가지가 있다.

🔪 슬라이싱

먼저, 리스트의 슬라이싱을 이용해 역배치하는 방법이다.

arr = [0, 1, 2, 3, 4, 5]
arr[1:5]

위와 같은 코드는 arr[1] ~ arr[4]까지를 잘라내어 [1, 2, 3, 4]를 만들어 낸다.

arr[1:5:3] # [1, 4]
arr[5:1:-1] # [5, 4, 3, 2]

마지막 숫자는 다음 숫자로 가는 간격을 의미하므로 -1을 적으면 거꾸로 가게 된다.

이를 이용한 역배치 코드는 다음과 같다.

먼저 역배치하고 싶은 부분을 슬라이싱한 뒤, 거꾸로 슬라이싱하여 대입한다.

# 인덱스 (a - 1)부터 (b - 1)까지의 요소를 역배치하는 경우
if a == 1:
		# 인덱스 0부터 역배치 하는 경우
        cards[a-1:b] = cards[b-1::-1]
    else:
        cards[a-1:b] = cards[b-1:a-2:-1]

⏪ reversed 함수

파이썬은 역배치를 위한 내장함수를 이미 가지고 있다.

첫번째로, reverse() 함수는 리스트의 메소드로, None을 반환하며 리스트 원래의 내용을 변형시킨다.

print(arr.reverse()) # None
print(arr) # [5, 4, 3, 2, 1, 0]

두번째로, reversed() 함수는 iterable 변수를 인자로 받아 역배치한 객체를 반환한다.

print(reversed(arr)) # <list_reverseiterator object at 0x000001D7872E33A0>
print(list(reversed(arr))) # [5, 4, 3, 2, 1, 0]
print(arr) # [0, 1, 2, 3, 4, 5]

reversed() 함수를 사용하여 주어진 리스트를 역배치하는 코드는 다음과 같다.

# 인덱스 (a - 1)부터 (b - 1)까지의 요소를 역배치하는 경우
cards[a-1:b] = reversed(cards[a-1:b])

✏️ 풀이

역배치 코드는 reverse 라는 함수를 만들어 구현했다.

import sys

cards = [i for i in range(1, 21)]

def reverse(a, b):
    if a == 1:
        cards[a-1:b] = cards[b-1::-1]
    else:
        cards[a-1:b] = cards[b-1:a-2:-1]

    # reversed 함수 사용
    # cards[a-1:b] = reversed(cards[a-1:b])


# 입력 -> 역순 정렬
for _ in range(10):
    a, b = map(int, sys.stdin.readline().split())
    reverse(a, b)

# 출력
for card in cards:
    sys.stdout.write(f'{card} ')

0개의 댓글