Open dlehdanakf opened 4 years ago
function build_bridge(connected_group, from, to) {
/* if is duplicated */
for(const group of connected_group) {
if(group.includes(from) && group.includes(to)) {
return false;
}
}
let _from_group_index = null, _to_group_index = null;
for(const i in connected_group) {
if(connected_group[i].includes(from)) { _from_group_index = i; }
if(connected_group[i].includes(to)) { _to_group_index = i; }
}
if(_from_group_index === null && _to_group_index === null) {
/* if is new group */
connected_group.push([ from, to ]);
} else if(_from_group_index !== null && _to_group_index !== null) {
/* if is connecting group */
connected_group[_from_group_index] = connected_group[_from_group_index].concat(connected_group[_to_group_index]);
connected_group.splice(_to_group_index, 1);
} else if(_from_group_index !== null) {
/* if is `from` connected */
connected_group[_from_group_index].push(to);
} else {
/* if is `to` connected */
connected_group[_to_group_index].push(from);
}
return true;
}
function solution(n, costs) {
const c = costs
.map((v, i) => {
const [ from, to, cost ] = v;
return { from, to, cost };
})
.sort((a, b) => { return a.cost < b.cost ? -1 : a.cost > b.cost ? 1 : 0; });
let answer = 0;
const connected_group = [];
while(c.length > 0) {
const [{ from, to, cost }] = c.splice(0, 1);
const result = build_bridge(connected_group, from, to);
if(result === true) {
answer += cost;
}
if(connected_group.length > 0 && connected_group[0].length === n) {
break;
}
}
return answer;
}
개요
예제
섬 연결하기
nodes
배열을false
에서true
로 바꾸면 연결되었다는 뜻이다.1 - 2
,3 - 4
끼리만 연결되더라도 배열 속 섬들은 모두true
로 표시된다.boolean
값으로 표시했던 것과는 달리, 이번에는 각 노드들을 그룹으로 묶어서 관리했다.Node1
섬과Node2
섬이 이어진다. 따라서 N2 그룹에 속한 모든 노드들이 N1 으로 이동하고, N2 그룹은 빈 배열로 초기화된다.