본문 바로가기

알고리즘/백준

백준 10812번 바구니 순서 바꾸기 (Python)

출처

백준 10812 바구니 순서 바꾸기


정답

import sys
N, M = map(int, sys.stdin.readline().rstrip().split())
bucket = [i for i in range(1,N+1)]
for _ in range(M):
    i, j, k = map(int, sys.stdin.readline().rstrip().split())
    before_bucket = bucket[:i-1] 
    changed_bucket1 = bucket[k-1:j] 
    changed_bucket2 = bucket[i-1:k-1] 
    after_bucket = bucket[j:] 
    bucket = before_bucket + changed_bucket1 + changed_bucket2 + after_bucket 
    #bucket = bucket[:i-1] + bucket[k-1:j] + bucket[i-1:k-1] + bucket[j:] 
for i in bucket:
    print(i, end=" ")    

문제


입출력


풀이

1. 입력값에 의한 초기 설정

# N, M = 10, 5 
N, M = map(int, sys.stdin.readline().rstrip().split())
# 바구니 초기값 : \[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]
# List Comprehension
bucket = [i for i in range(1,N+1)]
# 바구니 순서바꾸기 5회 수행 
for _ in range(M):

2. 바구니 순서바꾸기 알고리즘

# 1) 바구니 순서 바꾸는 방법 입력
i, j, k = map(int, sys.stdin.readline().rstrip().split()) # 1, 6, 4 
# 2) 바구니를 i, j, k 값에 따라 분할 한다 
# 순서를 바꾸지 않는 바구니 (~ begin-1) = []
before_bucket = bucket[:i-1] 
# 순서가 바뀐 바구니 1 (mid ~ end) =  [4, 5, 6]
changed_bucket1 = bucket[k-1:j] 
# 순서가 바뀐 바구니 2 (begin ~ mid-1) =  [1, 2, 3]
changed_bucket2 = bucket[i-1:k-1] 
# 순서를 바꾸지 않는 바구니 = [7, 8, 9, 10] 
after_bucket = bucket[j:] 
# 3) 바구니를 하나로 합친다 
bucket = before_bucket + changed_bucket1 + changed_bucket2 + after_bucket 

## 1) ~ 3) 을 한줄로 표현 
#bucket = bucket[:i-1] + bucket[k-1:j] + bucket[i-1:k-1] + bucket[j:] 

3. 정답 출력

# 가장 왼쪽에 있는 바구니부터 바구니에 적혀있는 순서를 공백으로 구분해 출력
for i in bucket:
    print(i, end=" ")    

바구니 순서바꾸기 회차별 바뀐 바구니 상태

회차 바구니 순서 바꾸기 바뀐 바구니 상태
1회 1 6 4 4 5 6 1 2 3 7 8 9 10
2회 3 9 8 4 5 8 9 6 1 2 3 7 10
3회 2 10 5 4 6 1 2 3 7 10 5 8 9
4회 1 3 3 1 4 6 2 3 7 10 5 8 9
5회 2 6 2 1 4 6 2 3 7 10 5 8 9