완전탐색 - 체커

강인호·5일 전
0

알고리즘 문제풀이

목록 보기
40/43

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 였던것

0개의 댓글