섬 연결하기 자바스크립트

HyosikPark·2020년 12월 12일
0

알고리즘

목록 보기
62/72
function solution(n, costs) {
    costs.sort((a,b) => a[2] - b[2]);
    
    let [from,to,answer] = costs.shift();
    let connected = new Set([from,to]);
        
    while(connected.size < n) {
        let index = costs.findIndex(([from,to]) => (
        connected.has(from) && !connected.has(to) ||
        connected.has(to) && !connected.has(from)    
        ));
        
        let [[from,to,price]] = costs.splice(index,1);
        connected.add(from).add(to);
        answer += price;
    }
    
    return answer;
}

원리

비용이 적게 드는 순으로 costs배열을 정렬한다.
처음 요소를 잘라내어 연결된 두 섬을 set에 저장.

모든 다리가 연결되었다면 set의 size는 n이 되기 때문에 반복문을 set의 size가 n이 되기 전까지 돌린다.

while 반복문.
먼저 costs를 하나씩 조사하면서 costs의 각 요소의 섬들 중 set에 하나만 저장되어있는 요소를 찾는다.(findIndex) 이미 비용순으로 정렬해뒀기 때문에 먼저 찾아지는 요소가 비용이 가장 적게 드는 연결방법이 된다.

다음으로 찾아낸 요소를 잘라내어 두 섬을 set에 저장하고 비용을 추가한다.

배운점

구조분해 할당 문법으로 배열형태의 요소의 각 index에 자유롭게 접근하는 방법을 다시 한번 상기하게 됐다.

splice로 요소를 잘라내면 [elem]를 반환한다.
shift() pop()등은 elem만 반환.

비용이 적게드는 순으로 다리를 연결하였을 때 반례가 있을 것만 같은 느낌이 들었는데 없다.

0개의 댓글