본문 바로가기

알고리즘, 자료구조

[백준| 단계별로 풀어보기 4단계 1차원 배열 | Python] 10811번 바구니 뒤집기

1. 문제 목적

이 문제의 주된 목적은 리스트 조작 기술과 슬라이스를 통한 부분 리스트의 뒤집기를 학습하는 데 있습니다. 문제를 해결함으로써, 리스트의 특정 부분을 선택하고, 그 부분을 수정하는 방법을 익히게 됩니다. 이는 데이터 구조와 알고리즘을 다루는 데 있어 필수적인 기술 중 하나입니다.

2. 핵심 개념

  • 리스트 슬라이싱: 리스트의 일부분을 선택하는 기술입니다. 리스트[start:end] 형태로 사용하며, start 인덱스부터 end-1 인덱스까지의 요소를 선택합니다.
  • 리스트 뒤집기: 선택된 리스트 부분을 반대 순서로 배치합니다. 이를 위해 슬라이스와 [::-1] (뒤집기) 연산을 사용합니다.

3. 문제 해결 절차

  1. 초기 바구니 상태를 리스트로 표현합니다.
  2. 주어진 명령의 수만큼 반복하여 각 명령을 처리합니다.
    • 각 명령에서 뒤집을 범위를 결정합니다.
    • 해당 범위의 리스트 부분을 슬라이싱하여 뒤집습니다.
  3. 최종 바구니 상태를 출력합니다.

4. 코드 작성

n, m = map(int, input().split())  # n: 바구니 개수, m: 명령의 수
baskets = list(range(1, n+1))  # 초기 바구니 상태

for _ in range(m):
    i, j = map(int, input().split())  # 뒤집을 범위
    baskets[i-1:j] = baskets[i-1:j][::-1]  # 범위 뒤집기

print(' '.join(map(str, baskets)))  # 최종 상태 출력

5. 코드 분석

  • n, m = map(int, input().split()): 사용자로부터 바구니의 개수(n)와 명령의 수(m)를 입력받습니다.
  • baskets = list(range(1, n+1)): 1부터 n까지의 숫자로 바구니의 초기 상태를 생성합니다.
  • for _ in range(m):: 사용자로부터 m개의 뒤집을 범위를 입력받아 처리합니다.
  • baskets[i-1:j] = baskets[i-1:j][::-1]: i번째부터 j번째 바구니까지 선택하여 그 부분을 뒤집습니다. 파이썬의 인덱스는 0부터 시작하기 때문에 i-1을 사용합니다.
  • print(' '.join(map(str, baskets))): 최종 바구니 상태를 공백으로 구분하여 출력합니다.