코딩연습장/백준

[백준/Python] 백준 10811번 바구니 뒤집기

gayomii 2023. 8. 22. 13:26

🏆백준 10811번 - 바구니 뒤집기

https://www.acmicpc.net/problem/10811

 

10811번: 바구니 뒤집기

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2

www.acmicpc.net


✍️문제

도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2번째 바구니, ..., 가장 오른쪽 바구니를 N번째 바구니라고 부른다.

도현이는 앞으로 M번 바구니의 순서를 역순으로 만들려고 한다. 도현이는 한 번 순서를 역순으로 바꿀 때, 순서를 역순으로 만들 범위를 정하고, 그 범위에 들어있는 바구니의 순서를 역순으로 만든다.

바구니의 순서를 어떻게 바꿀지 주어졌을 때, M번 바구니의 순서를 역순으로 만든 다음, 바구니에 적혀있는 번호를 가장 왼쪽 바구니부터 출력하는 프로그램을 작성하시오.


정답

n, m = map(int, input().split())
basket = [i for i in range(1, n+1)]

for _ in range(m):
    i, j = map(int, input().split())
    basket[i-1:j] = reversed(basket[i-1:j])
    
for i in basket:
    print(i, end = " ")

💫 해설 및 한줄평

바구니 n개와 반복횟수 m을 받아온다.

그리고 basket에 각각 1번부터 n번까지의 바구니라고 지정해준다.

 

그리고 for문을 m번 반복하여 i와 j를 받아오고, 하나씩 받아올 때 마다 basket에 reversed를 취해준다.

이때 2번바구니부터 5번바구니를 역순으로 하려면 list에서는 1번째와 5번째까지라고 지정해줘야 각각 해당하는 바구니를 역순으로 변경한다. (list는 0부터 시작하고 마지막 숫자까지 사용하기때문)

따라서 basket에 i-1번째부터 j번째까지의 구간을 역순으로 지정해준 뒤 해당 자리에 입력해준다.

 

마지막으로 basket을 for문을 반복하고, end를 통해 공백으로 출력한다.

 

처음에는 바구니에 역순으로 넣는 코드를 [i-1:j:-1]을 통해 슬라이싱으로 표현했는데 그렇게하면 j가 i-1보다 작아져 오류가 날수있다고하더라.. 그래서 reversed를 넣어주니 훨 간단하고 보기좋네!