Dev/PS

[백준/BOJ] 10811번: 바구니 뒤집기 (Python) 풀이

KangJerry 2024. 6. 4. 23:15

Baekjoon Online Judge (BOJ) 의 10811번 문제인 '바구니 뒤집기' 를 풀어보았다.
 
[문제 정보]
https://www.acmicpc.net/problem/10811


문제 개요:

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

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

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


[ 입력 ]
첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.

둘째 줄부터 M개의 줄에는 바구니의 순서를 역순으로 만드는 방법이 주어진다. 방법은 i j로 나타내고, 왼쪽으로부터 i번째 바구니부터 j번째 바구니의 순서를 역순으로 만든다는 뜻이다. (1 ≤ i ≤ j ≤ N)

도현이는 입력으로 주어진 순서대로 바구니의 순서를 바꾼다.

[ 출력 ]
모든 순서를 바꾼 다음에, 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력한다.

 

즉, M번의 테스트 케이스에서 각 i, j를 입력받고, i번째 바구니부터 j번째 바구니까지 순서를 역순으로 바꾸는 문제라고 보면 된다.

예시) N이 5일 경우 [1, 2, 3, 4, 5] 로 5번까지의 바구니가 주어지고, 첫 줄에서 1, 3을 입력받았다면 [3, 2, 1, 4, 5] 로 바뀌어야 한다.

 

알고리즘:

  1. N(바구니 개수), M(테스트 케이스 수)를 먼저 입력받는다.
  2. N개의 바구니를 담을 배열 basket을 추가해준다. (리스트 안에서 for문을 사용해 1~N 범위의 수를 N개 넣은 배열을 basket 변수에 초기화해준다.)
  3. M번 반복하는 반복문을 만들고, 각 케이스를 입력받을 수 있도록 반복문 내부에서 i, j를 입력받는다.

  4. 입력받은 i, j를 가지고 list의 slicing을 활용하여 i~j 범위의 바구니만을 역순으로 바꾼다.
    (예시: 만약 i가 1, j가 3일 경우 basket[i-1:j] 는 basket[0:3] 이라고 볼 수 있고, 해당 범위만큼 슬라이싱하면 [1, 2, 3] 이 나온다. 이 범위를 [::-1]을 사용하여 역순으로 바꿔주면 [3, 2, 1] 이 될 것이고, 이 배열을 본 배열의 범위에 초기화시켜주면 역순으로 정렬된 배열이 본 배열에 해당 범위만큼 적용된다. 즉 결과는 [3, 2, 1, 4, 5] 가 된다.)

  5. 4번 과정을 M번 반복하고, 정렬이 완료된 basket 배열은 배열 길이만큼 for문을 돌려 순서대로 값(바구니)을 출력해준다.

 

코드:

N, M = map(int, input().split())

basket = [i for i in range(1, N+1)]

for _ in range(0, M):
    i, j = map(int, input().split())
    basket[i-1:j] = basket[i-1:j][::-1]

for i in range(0, len(basket)):
    print(basket[i], end=' ')

위 풀이에 대한 질문이나 틀린 정보가 있다면 댓글로 말씀해 주시면 감사하겠습니다!
 
 

728x90