backjeon/Bronze

Baekjoon(백준) - 10811 (바구니 뒤집기) | Python

SecLogs YJ 2026. 3. 8. 16:19
import sys

N, M = map(int, sys.stdin.readline().split())

basket = list(range(1, N+1))

for _ in range(M):
    i, j = map(int, sys.stdin.readline().split())
    basket[i-1:j] = basket[i-1:j][::-1]
    
print(*basket)

 

1. 빠른 입력 처리

import sys

N, M = map(int, sys.stdin.readline().split())

 

백준과 같은 온라인 저지 환경에서는 입력 데이터의 양이 많을 수 있기 때문에,  input() 대신 sys.stdin.readline()을 사용하는 경우가 많다.
sys.stdin.readline()은 표준 입력을 빠르게 읽어오는 함수이며, split()을 통해 공백을 기준으로 문자열을 분리한 뒤 map(int, ...)을 이용해 각 값을 정수형으로 변환한다.
이렇게 하면 한 줄에 입력된 두 개의 정수를 각각 N과 M 변수에 저장할 수 있다.

 

 

2. 리스트 생성(range) 사용

basket = list(range(1, N+1))

 

range(1, N+1)은 1부터 N까지의 정수를 생성한다.
이를 list()로 감싸면 [1, 2, 3, ..., N] 형태의 리스트가 만들어진다.

문제에서 처음에는 각 바구니에 자신의 번호와 같은 공이 들어 있다고 했기 때문에, 이를 표현하기 위해 1부터 N까지의 숫자로 리스트를 초기화한다.

 

3. 반복문

for _ in range(M):

 

range(M)을 사용하여 M번 반복하는 반복문을 만든다.
여기서 _는 반복 횟수만 필요하고 실제로 변수 값을 사용하지 않을 때 관례적으로 사용하는 변수 이름이다.

즉, 이 반복문은 바구니를 뒤집는 작업을 M번 수행하기 위한 구조이다.

 

4. 여러 정수 입력 처리

i, j = map(int, sys.stdin.readline().split())

 

한 줄에 두 개의 정수가 입력될 때 사용하는 파이썬의 대표적인 입력 처리 패턴이다.

  • split() : 공백 기준으로 문자열을 나눔
  • map(int, ...) : 나누어진 문자열을 정수로 변환
  • i, j = : 두 개의 값을 각각 변수에 저장

문제에서는 i번째 바구니부터 j번째 바구니까지의 범위를 뒤집어야 하므로, 해당 범위를 입력받기 위해 이 문장을 사용한다.

 

5. 리스트 슬라이싱 + 뒤집기

    basket[i-1:j] = basket[i-1:j][::-1]

 

이 부분이 문제의 핵심 로직이다.

 

basket[i-1:j는 리스트에서 i번째 바구니부터 j번째 바구니까지의 구간을 슬라이싱하는 코드이다.
파이썬 리스트는 인덱스가 0부터 시작하기 때문에 i-1을 사용한다.

 

[::-1]은 리스트를 역순으로 뒤집는 슬라이싱 문법이다.

 

즉, basket[i-1:j][::-1]선택한 구간을 뒤집은 새로운 리스트가 된다.

 

 

6. 리스트 언패킹 출력

print(*basket)

 

*는 언패킹(unpacking) 연산자이다.
리스트의 요소들을 하나씩 꺼내어 print()에 전달한다.


🧐 리스트의 특정 구간을 뒤집을 때는 list[a:b] = list[a:b][::-1] 패턴을 떠올리기

👉 Baekjoon(백준) - 10811 (바구니 뒤집기)