[boj] 15686. 치킨 배달 (node.js)

호이·2022년 6월 22일
0

algorithm

목록 보기
77/77
post-thumbnail

문제

[boj] 15686. 치킨 배달 (node.js)

  • 브루트포스 + 구현문제! 재귀함수로 모든 후보군을 탐색하고, 그에 따른 값을 계산해서 최솟값을 구하면 된다.

풀이

  • 값을 계산할 때는 후보군이 될 수 있는 치킨가게와, 집들 간의 거리만 계산하면 되므로 이중포문을 사용해 구할 수 있다. 처음에 BFS로 접근해서 거리를 계산하는 바람에 시간 초과가 발생했는데, 단순히 풀리는 문제였다.

전체 풀이

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const dir = [
  [-1, 0],
  [0, 1],
  [1, 0],
  [0, -1],
];

const solution = () => {
  const [N, M] = input();
  let chickens = [];
  let houses = [];
  const arr = [];
  for (let i = 0; i < N; i++) {
    arr[i] = input();
    arr[i].forEach((elem, idx) => {
      if (elem === 1) houses.push([i, idx]);
      else if (elem === 2) chickens.push([i, idx]);
    });
  }

  let cand = [];
  let selected = [];
  let used = [];
  rec(0, 0);

  function rec(k, startIdx) {
    if (k === M) return cand.push([...selected]);
    else {
      for (let i = startIdx; i < chickens.length; i++) {
        if (used[i]) continue;
        used[i] = 1;
        selected.push(chickens[i]);
        rec(k + 1, i);
        used[i] = 0;
        selected.splice(selected.length - 1);
      }
    }
  }

  let result = Infinity;
  for (let i = 0; i < cand.length; i++) {
    let dist = 0;
    houses.forEach(([hr, hc]) => {
      let temp = N * N;
      cand[i].forEach(([r, c]) => {
        temp = Math.min(temp, Math.abs(hr - r) + Math.abs(hc - c));
      });
      dist += temp;
    });
    result = Math.min(dist, result);
  }
  return result;
};

let _line = 0;
const input = () => stdin[_line++].split(" ").map(Number);

let stdin = [];
rl.on("line", function (line) {
  stdin.push(line);
}).on("close", function () {
  console.log(solution());
  process.exit();
});
profile
매일 부활하는 개복치

0개의 댓글