From 5137936552dc584bde7ff91135801fbe022d7e5a Mon Sep 17 00:00:00 2001 From: SSUM <116950962+ssum21@users.noreply.github.com> Date: Fri, 7 Mar 2025 22:08:12 +0900 Subject: [PATCH] =?UTF-8?q?[level=203]=20Title:=20=EC=84=AC=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=ED=95=98=EA=B8=B0,=20Time:=200.05=20ms,=20Memory:=201?= =?UTF-8?q?0.2=20MB=20-BaekjoonHub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 프로그래머스/3/42861. 섬 연결하기/README.md | 60 +++++++++++++++++++ .../3/42861. 섬 연결하기/섬 연결하기.py | 31 ++++++++++ 2 files changed, 91 insertions(+) create mode 100644 프로그래머스/3/42861. 섬 연결하기/README.md create mode 100644 프로그래머스/3/42861. 섬 연결하기/섬 연결하기.py diff --git a/프로그래머스/3/42861. 섬 연결하기/README.md b/프로그래머스/3/42861. 섬 연결하기/README.md new file mode 100644 index 0000000..9803913 --- /dev/null +++ b/프로그래머스/3/42861. 섬 연결하기/README.md @@ -0,0 +1,60 @@ +# [level 3] 섬 연결하기 - 42861 + +[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/42861) + +### 성능 요약 + +메모리: 10.2 MB, 시간: 0.05 ms + +### 구분 + +코딩테스트 연습 > 탐욕법(Greedy) + +### 채점결과 + +정확성: 100.0
합계: 100.0 / 100.0 + +### 제출 일자 + +2025년 03월 07일 22:08:10 + +### 문제 설명 + +

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

+ +

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

+ +

제한사항

+ + + +

입출력 예

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

입출력 예 설명

+ +

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

+ +

image.png

+ + +> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges \ No newline at end of file diff --git a/프로그래머스/3/42861. 섬 연결하기/섬 연결하기.py b/프로그래머스/3/42861. 섬 연결하기/섬 연결하기.py new file mode 100644 index 0000000..9000ac1 --- /dev/null +++ b/프로그래머스/3/42861. 섬 연결하기/섬 연결하기.py @@ -0,0 +1,31 @@ +def solution(n, costs): + # Union-Find 초기화: 각 섬은 자기 자신을 부모로 갖는다. + parent = list(range(n)) + + # find 함수: 경로 압축을 적용하여 부모를 찾는다. + def find(x): + if parent[x] != x: + parent[x] = find(parent[x]) + return parent[x] + + # union 함수: 두 노드가 다른 집합에 속하면 합치고 True 반환 + def union(x, y): + root_x = find(x) + root_y = find(y) + if root_x != root_y: + parent[root_y] = root_x + return True + return False + + # 비용 오름차순으로 정렬 + costs.sort(key=lambda x: x[2]) + + total_cost = 0 + edges_used = 0 + for start, end, cost in costs: + if union(start, end): + total_cost += cost + edges_used += 1 + if edges_used == n - 1: + break + return total_cost