혼자서는 이 문제를 못풀었다. 평균값을 구하는 방법으로 풀었는데 틀렸고, 이후 방법을 생각했는데 도무지 모르겠어서 다른 풀이를 찾아봤다. 풀이를 봤지만 명확하게 이해는 되지 않았다.
점의 좌표가 (a1,b1),(a2,b2),...일 때 어떤 칸(x,y)까지 모든 점이 이동하는 데 걸리는 이동거리는 |x-a1|+|x-a2|+...+|y-b1|+|y-b2|+...
다.
|x-a1|+|x-a2|+...+|y-b1|+|y-b2|+...
의 최솟값을 구해야 한다.|x-a1|+|x-a2|+...의 최솟값
과 |y-b1|+|y-b2|+...의 최솟값
을 구한 뒤 더하면 전체 최솟값이 된다.import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
List<Integer> xList = new ArrayList<Integer>();
List<Integer> yList = new ArrayList<Integer>();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
xList.add(x);
yList.add(y);
}
Collections.sort(xList);
Collections.sort(yList);
int midIdx = (M/2);
int midX = xList.get(midIdx);
int midY = yList.get(midIdx);
int Score = 0;
for (int i = 0; i < M; i++) {
Score += Math.abs(midX-xList.get(i));
Score += Math.abs(midY-yList.get(i));
}
System.out.println(Score);
}
}