https://www.acmicpc.net/problem/1090
모이는 지점 x1,y1이 정해지고, N의 지점 별로 해당 지점까지의 거리를 구해서, 각 지점별로 최솟값을 구한다.
const Answer = N => {
let distances = [];
const xValues = {};
const yValues = {};
// 지점에 대한 for문
for (let i = 0; i < N.length; i++) {
const [targetX, targetY] = N[i].split(" ");
xValues[targetX] = true;
yValues[targetY] = true;
}
for (let i = 0; i < Object.keys(xValues).length; i++) {
for (let j = 0; j < Object.keys(yValues).length; j++) {
const x = Number(Object.keys(xValues)[i]);
const y = Number(Object.keys(xValues)[j]);
// 지점마다 values와 거리 등록
let values = [];
let totalDistance = 0;
N.forEach(location => {
const [locationX, locationY] = location.split(" ").map(Number);
const value = Math.abs(x - locationX) + Math.abs(y - locationY);
totalDistance += value;
values.push(value);
});
values = values.sort((a, b) => a - b);
let resultValue = 0;
const result = [];
values.forEach(i => {
resultValue += i;
result.push(resultValue);
});
distances.push({ totalDistance, result });
}
}
// 최솟값 정렬
distances = distances.sort((a, b) => a.totalDistance - b.totalDistance);
const results = distances.map((i, index) => i.result);
let answerList = [];
// k개를 모을때 각각 어떤 지점이 최소로 모이는지
for (let i = 0; i < N.length; i++) {
answerList.push(Math.min(...results.map(j => j[i])));
}
console.log(answerList);
};
k개를 모을때 마다 지점이 달라질 수 있다는 점 때문에 꽤 고전을 했었다.
ex=> ["15 14", "15 16", "14 15", "16 15"] 의 경우에는
1개 모으는 경우는 특정 지점 에서 모이는 경우 => 0번
2개 모으는 경우는 2번 움직이는 경우의 수가 최소
3개 모으는 경우는 15,15에서 3개를 모으는 경우의 수가 최소
이므로 출력이 0 2 3 4 였던것