파이썬/예제

백준 10811번 바구니 뒤집기 - swap 매커니즘

thpop 2025. 5. 19. 16:00
반응형

백준 10811번 / 바구니 뒤집기 : https://www.acmicpc.net/problem/10811

 

이번 문제는 앞서 풀어본 바구니와 공 문제와 비슷하다. N개의 바구니가 있고, 각 바구니에는 1번부터 N번까지의 번호가 순서대로 적혀있다. M번 동안 특정 구간 [a, b]를 선택하여 그 구간에 있는 바구니들의 순서를 역순으로 뒤집는 작업을 한다. 모든 작업이 끝난 후, 1번 바구니부터 N번 바구니까지 각각 어떤 숫자가 적혀있는지 공백으로 구분하여 출력해야 한다.

 

이 또한 swap 매커니즘을 이용하면 간단히 해결할 수 있다.

 

문제를 푸는 흐름은 다음과 같다.

  • 바구니의 개수 N과 순서를 뒤집는 횟수 M을 입력받는다.
  • 크기가 N인 리스트를 만들고, 각 바구니의 번호에 해당하는 인덱스에 인덱스 +1을 넣어 초기화한다.
  • M번 반복하면서 다음을 수행한다:
    • 순서를 뒤집을 시작 바구니 번호 a와 끝 바구니 번호 b를 입력받는다.
    • 리스트 인덱스는 0부터 시작하므로, a-1번 인덱스부터 b-1번 인덱스까지에 해당하는 부분을 가져온다.
    • 가져온 부분 리스트를 역순으로 뒤집는다. 
    • 뒤집힌 부분 리스트를 원래 리스트의 a-1번 인덱스부터 b-1번 인덱스까지의 위치에 다시 할당한다.
  • 모든 작업이 끝나면, 리스트의 모든 요소를 문자열로 변환하여 공백으로 구분해 한 줄에 출력한다.

 

내가 만든 코드는 다음과 같다.

N, M = map(int,input().split())
list1 = []

for i in range(N):
    list1.append(i+1)

for j in range(M):
    a, b = map(int,input().split())
    temp = list1[a-1:b]
    temp.reverse()
    list1[a-1:b] = temp

k = ' '.join(map(str,list1))
print(k)

 

출력 결과는 아래와 같다.

반응형