래원

[Programmers] 섬 연결하기 - Python 본문

알고리즘/프로그래머스

[Programmers] 섬 연결하기 - Python

Laewon Jeong 2024. 11. 30. 23:36

 

난이도: Lv.3

 

문제 설명


개의 섬 사이에 다리를 건설하는 비용(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의 비용이 주어지지 않습니다.
  • 모든 섬 사이의 다리 건설 비용이 주어지지 않습니다. 이 경우, 두 섬 사이의 건설이 불가능한 것으로 봅니다.
  • 연결할 수 없는 섬은 주어지지 않습니다.

 

입출력 예


n costs return
4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

 

입출력 예 설명


costs를 그림으로 표현하면 다음과 같으며, 이때 초록색 경로로 연결하는 것이 가장 적은 비용으로 모두를 통행할 수 있도록 만드는 방법입니다.

 

✏ Solution(솔루션)


def find(parent, x):
	if parent[x] == x:
		return x
	parent[x] = find(parent, parent[x])
	return parent[x]

def union(parent, a, b):
	rootA = find(parent, a)
	rootB = find(parent, b)
	if rootA < rootB:
		parent[rootB] = rootA
	else:
		parent[rootA] = rootB

def solution(n, costs):
	parent = [0] * (n + 1)

    	edges = []
    	result = 0

    	for i in range(1, n + 1):
        	parent[i] = i
        
    	costs.sort(key = lambda x:x[2])
    
    	for cost in costs:
        		a, b, c = cost
        		if find(parent, a) != find(parent, b):
            		union(parent, a, b)
            		result += c

    return result

 

실행 결과


 

코드 설명


이 문제는 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return하면 되는 문제였다.

 

예시 그림을 보고 바로 MST가 생각이 났다.

 

MST는 Minimum Spanning Tree의 약자로 최소 비용으로 만들 수 있는 신장 트리를 찾는 알고리즘이다.

대표적으로 Kruskal Algorithm이 있다.

 

따라서, Kruskal Algorithm이 모든 섬을 연결하면서 필요한 최소 비용을 찾기에 적합한 알고리즘이라 생각이 들었다.

 

생각이 들자마자 Kruskal Algorithm을 작성했고, 쉽게 정답을 맞출 수 있었다.

 

Kruskal Algorithm은 cost를 정렬을 시켜주어야하는데 첫 제출때 까먹고 정렬을 안시켜서 25점 밖에 맞지 못했다...

이런점은 주의가 필요해보인다..


[Programmers] 섬 연결하기

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr