본문 바로가기
IT 이야기/알고리즘 공부

[Programmers] 섬 연결하기

by Dblog 2020. 11. 26.
728x90

https://programmers.co.kr/learn/courses/30/lessons/42861

 

코딩테스트 연습 - 섬 연결하기

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

programmers.co.kr

 

파이썬을 사용했습니다.

 

문제를 풀때 가장 중요한 부분이 사이클이 없고 분리된 섬 없이  모든 섬이 연결되는 것입니다.

문제를 푼 방법은 먼저 다리를 연결하는 값을 오름차순으로 정렬한 뒤 한번 연결된 섬을을 미리 정의한 그룹에 넣는 것입니다. 또한 연결하려는 양 끝 섬이 이미 정의한 그룹안에 있다면 다리를 건설 하는 것을 포기합니다. 

알고리즘은 Kruskal 알고리즘으로 분류됩니다.

https://ko.wikipedia.org/wiki/%ED%81%AC%EB%9F%AC%EC%8A%A4%EC%BB%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

 

크러스컬 알고리즘 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴퓨터 과학에서, 크러스컬 알고리즘(영어: Kruskal’s algorithm)은 최소 비용 신장 부분 그래프를 찾는 알고리즘이다. 변의 개수를 E {\displaystyle E} , 꼭짓점의 개수

ko.wikipedia.org

 



정답 코드
def solution(n, costs):
    answer = 0
    costs = sorted(costs,key = lambda x: x[2])
    set_target = set([costs[0][0]])
    
    while len(set_target) < n:
        for i, val in enumerate(costs):
            if val[0] in set_target and val[1] in set_target:
                continue
                
            if val[0] in set_target or val[1] in set_target:
                set_target.update([val[0], val[1]])
                answer += val[2]
                costs[i] = [-1, -1, -1]
                break
    
    return answer

 

 

참고링크

 

728x90

댓글