728x90
문제
https://www.acmicpc.net/problem/15686
문제 해석
이 문제는 일반적인 백트래킹 문제이며, 처음 배열에서 치킨집과 가정집을 구분하여 풀면 쉽게 풀 수 있다.
풀이
const filePath = process.platform === "linux" ? "dev/stdin" : "../test.txt";
const input = require("fs").readFileSync(filePath).toString().trim().split("\n");
function solution(input) {
const [N, M] = input[0].split(" ").map(Number);
const board = input.slice(1).map((v) => v.split(" ").map(Number));
const chicken = [];
const house = [];
let answer = Infinity;
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
if (board[i][j] === 2) {
chicken.push([i, j]);
} else if (board[i][j] === 1) {
house.push([i, j]);
}
}
}
const visited = new Array(chicken.length).fill(false);
const getMinDistance = () => {
let sum = 0;
house.forEach(([hx, hy]) => {
let min = Infinity;
chicken.forEach(([cx, cy], index) => {
if (visited[index] === true) {
min = Math.min(min, Math.abs(hx - cx) + Math.abs(hy - cy));
}
});
sum += min;
});
return sum;
};
function DFS(L, num) {
if (num === M) {
answer = Math.min(answer, getMinDistance());
return;
}
for (let i = L; i < chicken.length; i++) {
if (visited[i]) continue;
visited[i] = true;
DFS(i, num + 1);
visited[i] = false;
}
}
DFS(0, 0);
return answer;
}
console.log(solution(input));
끝
728x90
'WEB > 백준 문제 풀이' 카테고리의 다른 글
백준 16987 계란으로 계란치기 (node.js) (0) | 2024.06.24 |
---|---|
백준 15686 연산자 끼워 넣기 (node.js) (0) | 2024.06.22 |
백준 9663 N-Queen (node.js) (0) | 2024.06.19 |
백준 1043 거짓말 (node.js) (1) | 2024.06.17 |
백준 1922 네트워크 연결 (node.js) (0) | 2024.06.17 |