백준 10812번 바로가기

나의 풀이

f=lambda:map(int, input().split())
n_basket, n_round = f()
*ans, = range(n_basket + 1)
exec("i,j,k=f();ans[i:j+1]=ans[k:j+1]+ans[i:k];"*n_round)
print(*ans[1:])

백준 10811 - 바구니 뒤집기와 매우 유사한데, k를 기준으로 뒤집어야하기 때문에 범위 설정에 유의해야 했다. 특히 python에서 슬라이싱을 할 때에 list[start:end]이면 start부터 (end-1)요소까지 범위이기 때문에 끝부분에 +1을 해줘야하는지 판단이 헷갈렸다. 그럴 땐 표나 그림을 이용하면 수월하게 해결할 수 있다.

(변형 전)

begin begin+1 mid-1 mid mid+1 end-1 end
i i+1 k-1 k j-1 j

(변형 후)

mid mid+1 end-1 end begin begin+1 mid-1
k j-1 j i i+1 k-1

list에서 [k:j+1]과 [i:k] 범위를 잘라낸 뒤에 이어붙여, [i:j+1] 영역에 대응시키면 된다는 것을 시각적으로 확인할 수 있다.