📖 문제
🧑🏻💻 풀이 과정
1) 문제 이해 및 접근
최소 스패닝 트리 문제로 크루스칼 알고리즘으로 접근하였습니다.
2) 알고리즘
- 크루스칼
3) 풀이 코드
사용 언어 - Python
import sys
sys.setrecursionlimit(100000)
sys.stdin = open('input.txt')
def find(n): # 정점이 속한 집단의 대표를 찾음
if n != s[n]:
s[n] = find(s[n])
return s[n]
def union(x, y): # 정점 x와 y를 합침
s[find(x)] = find(y)
def solution():
global answer
edge_cnt, idx = 0, 0 # 정점이 모두 연결되었는지 확인을 위한 변수, 간선의 인덱스
while edge_cnt != N-1: # 정점이 모두 연결되지 않았으면
x = linked[idx][1] # 정점
y = linked[idx][2]
if find(x) != find(y): # 서로 연결이 되어 있지 않으면
union(x, y) # 두 정점을 연결
answer += linked[idx][0] # 정답 증가
edge_cnt += 1
idx += 1
N = int(sys.stdin.readline()) # 정점의 개수
info = [list(map(int, sys.stdin.readline().split())) for _ in range(N)] # 정점간 거리의 정보
s = list(range(N)) # 정점이 어디에 속했는지 구분할 리스트
linked = [] # 간선의 정보들
answer = 0
for i in range(N): # 주어진 정보를 반복하여 간선의 정보들을 저장
for j in range(i+1, N):
linked.append((info[i][j], i, j))
linked.sort()
solution()
print(answer)
📝 결과 및 학습한 내용
1) 어려웠던 내용
특별히 없습니다.
2) 새롭게 학습한 내용
특별히 없습니다.
🔗 문제 링크
- https://www.acmicpc.net/problem/16398
※ 오류 및 오타, 다른 의견이 있는 경우 댓글을 남겨주시면 감사하겠습니다
'알고리즘 문제풀이 > Python' 카테고리의 다른 글
[백준] 1254 팰린드롬 만들기 (0) | 2022.02.05 |
---|---|
[백준] 4358 생태학 (0) | 2022.02.04 |
[백준] 1197 최소 스패닝 트리 (0) | 2022.02.02 |
[프로그래머스] 뉴스 클러스터링 (0) | 2022.02.01 |
[백준] 15686 치킨 배달 (0) | 2022.01.31 |
댓글