[Programmers] Lv.3 섬 연결하기 (python, js)

j-ij-i·2022년 12월 10일
1

알고리즘 문제풀이

목록 보기
1/10
post-thumbnail

문제 링크

문제 설명
n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.

다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.

제한사항

  • 섬의 개수 n은 1 이상 100 이하입니다.
  • costs의 길이는 ((n-1) * n) / 2이하입니다.
  • 임의의 i에 대해, costs[i][0] 와 costs[i][1]에는 다리가 연결되는 두 섬의 번호가 들어있고, costs[i][2]에는 이 두 섬을 연결하는 다리를 건설할 때 드는 비용입니다.
  • 같은 연결은 두 번 주어지지 않습니다. 또한 순서가 바뀌더라도 같은 연결로 봅니다. 즉 0과 1 사이를 연결하는 비용이 주어졌을 때, 1과 0의 비용이 주어지지 않습니다.
  • 모든 섬 사이의 다리 건설 비용이 주어지지 않습니다. 이 경우, 두 섬 사이의 건설이 불가능한 것으로 봅니다.
  • 연결할 수 없는 섬은 주어지지 않습니다.


풀이과정

  • 그래프 탐색을 하여 최소신장트리가 되도록 만드는 크루스칼 알고리즘을 이용하여 풀었다.
  • 기본적인 union-find 방법을 처음에 생각해서 풀었지만, 더 좋은 방법이 있을까 찾아본 결과 set을 사용해서 vertex를 추가하면서 간선의 가중치를 늘려가는 방식의 방법을 찾아 이 방식으로 풀게 되었다.
  • 하지만 link된 vertex가 증가할때마다 costs의 처음부터 탐색하는 점이 있어 costs가 늘어나게 되면 좋지 않다고 느꼈다.

파이썬 풀이

def solution(n, costs):
    answer = 0
    
    costs.sort(key = lambda x : x[2])
    link = set([costs[0][0]])

    while len(link) < n:
        for v in costs:
            if v[0] in link and v[1] in link:
                continue
            if v[0] in link or v[1] in link:
                link.update([v[0],v[1]])
                answer += v[2]
                break
    
    return answer

자바스크립트 풀이

function solution(n, costs) {
    var answer = 0;
    costs.sort((a,b) => (a[2]-b[2]))
    let link = new Set([costs[0][0]]);

    while(link.size < n){
        for(let v = 0 ; v < costs.length; v++){        
            if(link.has(costs[v][0]) && link.has(costs[v][1])){
                continue;
            }
            if(link.has(costs[v][0]) || link.has(costs[v][1])){
                answer += costs[v][2]
                link.add(costs[v][0])
                link.add(costs[v][1])    
                break
            }
        }
    }
    return answer;
}

참고
https://velog.io/@henrynoowah/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%AC-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-PYTHON

profile
안녕하세요, 프론트엔드를 좋아하는 개발자 jiji입니다.

0개의 댓글