창고 컨테이너 재배열

시간 제한2초메모리 제한128 MB

요약
빈 자리 하나만 이용해 컨테이너를 옮겨서 M개씩 묶인 각 구간이 서로 다른 M개의 제품으로 채워지도록 만들고 빈 자리를 원위치로 복귀시키는 최소 이동 횟수를 구합니다.
난이도

어려움10점 중 8점

유형
그래프, 그리디, 조합론
정답자
아직 제출이 없습니다

문제

한 회사가 N개의 매장을 운영하며 M가지 서로 다른 제품을 판매한다. 제품은 1부터 M까지의 번호로 구분한다. 창고에서는 각 제품을 매장 수만큼 담아 두므로, 각 제품 번호가 붙은 컨테이너가 정확히 N개씩 있고 컨테이너는 모두 N×M개이다. 창고가 좁아 컨테이너들은 한 줄로 놓여 있으며, 위치는 1번부터 N×M번까지이다. 마지막 위치인 N×M+1번은 컨테이너가 없는 빈 자리 하나이다.

배송을 빠르게 하기 위해, 관리자는 줄의 앞에서부터 M개씩 묶은 각 구간(위치 1..M, M+1..2M, ...)이 서로 다른 M개의 제품 번호(각 제품 하나씩)를 담도록 재배열하려 한다. 한 구간 안에서의 순서는 상관없다.

재배열은 오직 빈 자리를 이용해서만 한다. 한 번의 이동은 어떤 위치에 있는 컨테이너 하나를 현재 비어 있는 자리로 옮기는 것이며, 옮긴 뒤에는 원래 있던 위치가 빈 자리가 된다. 모든 이동이 끝난 뒤 빈 자리는 다시 N×M+1번 위치에 있어야 한다.

필요한 이동 횟수의 최솟값을 구하여라.

입력

첫째 줄에 두 정수 N과 M이 주어진다 (1 ≤ N ≤ 400, 1 ≤ M ≤ 400). 둘째 줄에는 컨테이너의 초기 배열을 나타내는 N×M개의 정수가 왼쪽부터 순서대로 주어진다. 각 제품 번호 x (1 ≤ x ≤ M)는 정확히 N번 나타난다.

출력

앞에서부터 M개씩 묶은 모든 구간이 서로 다른 M개의 제품 번호를 담고, 빈 자리가 다시 N×M+1번 위치로 돌아오도록 만드는 데 필요한 최소 이동 횟수를 정수 하나로 출력한다.

예제6

  1. 예제 1

    입력
    5 6
    4 1 3 1 6 5 2 3 2 3 5 6 2 1 4 5 6 4 1 3 2 4 5 5 1 2 3 4 6 6
    
    예상 출력
    8
    
  2. 예제 2

    입력
    2 3
    1 2 3 1 2 3
    
    예상 출력
    0
    
  3. 예제 3

    입력
    1 5
    3 1 5 2 4
    
    예상 출력
    0
    
  4. 예제 4

    입력
    4 1
    1 1 1 1
    
    예상 출력
    0
    
  5. 예제 5

    입력
    2 2
    1 1 2 2
    
    예상 출력
    3
    
  6. 예제 6

    입력
    2 3
    1 1 2 3 3 2
    
    예상 출력
    3