undefined
[백준 - node.js] 스타트와 링크 14889번 본문
반응형
문제 설명
핵심
1. 팀 구성에 대한 모든 경우의 수를 구하기
2. 각 팀에서 얻을 수 있는 모든 능력치의 합을 구하기
문제 풀이
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
let n = 0;
let count = 0;
rl.on('line', function (line) {
if (!count) n = +line;
else input.push(line.split(' ').map(e => +e));
count++;
}).on('close', function () {
solution(input);
process.exit();
});
const solution = input => {
// 초기세팅
const visited = new Array(n).fill(false);
const arr = [];
let a = [];
let b = [];
let min = Infinity;
let aSum = 0;
let bSum = 0;
// dfs
const dfs = (count, idx) => {
// base case => arr(한 팀)의 자릿수가 n / 2 일때
if (count === n / 2) {
// 구해준 arr를 활용하여 반대쪽 팀을 구해준다
// A팀, B팀으로 나누어줌
for (let i = 0; i < n; i++) {
if (arr.includes(i)) a.push(i);
else b.push(i);
}
// 이중 for문을 활용하여 모든 경우의 팀능력치를 구해준다
for (let i = 0; i < a.length; i++) {
for (let j = i + 1; j < a.length; j++) {
aSum += input[a[i]][a[j]] + input[a[j]][a[i]];
bSum += input[b[i]][b[j]] + input[b[j]][b[i]];
}
}
min = Math.min(min, Math.abs(aSum - bSum));
// 초기화
aSum = 0;
bSum = 0;
a = [];
b = [];
}
// 순회하여 팀으로 구성 될 모든 경우의 수를 구해준다.
for (let i = idx; i < n; i++) {
if (!visited[i]) {
arr.push(i);
visited[i] = true;
dfs(count + 1, i);
arr.pop();
visited[i] = false;
}
}
};
dfs(0, 0);
console.log(min);
};
https://www.acmicpc.net/problem/14889
반응형
'Coding Test' 카테고리의 다른 글
[백준 - Node.js] 토마토 7576번 (0) | 2022.10.02 |
---|---|
[백준 - Node.js] 암호 만들기 1759번 (0) | 2022.09.23 |
[백준 - node.js] 1, 2, 3 더하기 9095번 (0) | 2022.09.22 |
[백준 - node.js] 외판원 순회2 10971번 (1) | 2022.09.21 |
[백준] 다음 순열 10972번 - Javascript / Node.js (0) | 2022.09.11 |
Comments