PS/프로그래머스

[Level2][Javascript] 섬 연결하기

returnzero 2022. 6. 24. 21:09
//minimum spanning tree problem

function solution(n, costs) {
    var answer = 0;
    let visited={};
    if(n===1) return 0;
    costs.sort(function(a,b){
    return a[2]-b[2]; 
    })
    // console.log(costs);
    
    visited [costs[0][0]]=1;
    visited [costs[0][1]]=1;
    answer+= costs[0][2];
    costs.shift();
    while( Object.keys(visited).length!==n){
        for(let index=0; index<costs.length;index++){
            let e= costs[index];
        if(visited[e[0]]===1 && visited[e[1]]===1){
        // console.log("IGNORE");
        }
        else{
        if(visited [e[0]]===1){
            visited[e[1]]=1;
            answer+=e[2];
            costs.splice(index,1)
            break;
        }
        else if(visited [e[1]]===1){
            visited[e[0]]=1;
            answer+=e[2];
            costs.splice(index,1)
            break;
        }
        }
    }
    }
    return answer;
}

최소 신장 트리이다. 

최소 신장 트리 알고리즘은 프림, 크루스칼이 존재하는데, 

프림은 한번 edge를 결정하면 무조건 spanning tree의 일부분이 된다. 하지만 kruskal의 경우 edge가 추가된 이후, acyclic한지 검증해본다. 이를 n-1번 반복하는 것을 목표로 한다. 

 

간선의 수가 적은 경우 크루스칼이 유리하고, 간선의 수가 많은 경우 프림이 유리하다. 

크루스칼 O(E log V);

프림=> binary Heap구현시 O(E log V); -> heap 자료구조상 빠르게 접근 가능하니까

unsorted array O(V^2)

 

/*/프림과 크루스칼 추가적으로 내용 작성 필요.