[Programmers] 섬 연결하기 - Python

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

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[Programmers] 가장 먼 노드 (Python)  (1) 2024.12.08
[Programmers] [PCCP 기출문제] 3번 / 충돌위험 찾기 - Python  (1) 2024.12.04
[Programmers] 도넛과 막대 그래프 - Python  (1) 2024.11.29
[Programmers] 베스트앨범 - Python  (0) 2024.11.26
[Programmers] 오픈채팅방  (0) 2024.11.24
'알고리즘/프로그래머스' 카테고리의 다른 글
  • [Programmers] 가장 먼 노드 (Python)
  • [Programmers] [PCCP 기출문제] 3번 / 충돌위험 찾기 - Python
  • [Programmers] 도넛과 막대 그래프 - Python
  • [Programmers] 베스트앨범 - Python
Laewon Jeong
Laewon Jeong
  • Laewon Jeong
    래원
    Laewon Jeong
    글쓰기 | 관리
  • GitHub

    • github.com/laewonJeong
  • 전체
    오늘
    어제
    • 분류 전체보기 (172)
      • Docker 및 Kubernetes (11)
        • Docker (5)
        • Kubernetes (6)
      • Data Engineering (18)
        • Hadoop (5)
        • Spark (5)
        • Kafka (5)
        • Airflow (3)
      • CI|CD (3)
      • 알고리즘 (136)
        • 알고리즘 (2)
        • LeetCode (118)
        • 프로그래머스 (11)
        • BOJ (1)
        • 코딩테스트 대비 (4)
      • 서버 (2)
        • 미니 서버 (2)
      • 잡담 (1)
  • 태그

    Kubernetes
    백트래킹
    DP
    leetcode
    알고리즘
    누적합
    파이썬
    dfs
    리트코드
    티스토리챌린지
    오블완
    이진탐색
    아파치 스파크
    프로그래머스
    쿠버네티스
    String
    문자열
    분산
    분산처리
    그래프
    docker
    아파치 하둡
    programmers
    Apache Spark
    heapq
    도커
    BFS
    우선순위큐
    Python
    코딩테스트
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Laewon Jeong
[Programmers] 섬 연결하기 - Python
상단으로

티스토리툴바