Sangmun

백준 4386번 별자리 만들기 본문

알고리즘/백준

백준 4386번 별자리 만들기

상상2 2022. 8. 25. 23:49

https://www.acmicpc.net/problem/4386

 

4386번: 별자리 만들기

도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일

www.acmicpc.net

 

기본적인 크루스칼 알고리즘을 활용하였다.

 

크루스칼 알고리즘의 기본 포맷은 나동빈님의 이것이 취업을 위한 코딩테스다를 참조하였고

 

각 별자리들의 거리를 계산하기 위하여 2중 for문을 사용하였다.

N이 최대가 100이라서 2중 for문으로도 쉽게 풀리는 문제였다.

 

import math
import sys
input = sys.stdin.readline

def find_parent(parent,x):

    if parent[x] != x:
        parent[x] = find_parent(parent,parent[x])
    return parent[x]

def union_parent(parent, a,b):
    a = find_parent(parent,a)
    b = find_parent(parent,b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

v = int(input())
parent = [0] * (v+1)

edges = []
result = 0

for i in range(1, v+1):
    parent[i] = i

tmp_list = []
for _ in range(v):
    a,b = map(float,input().split())
    tmp_list.append((a,b))

for idx1, each in enumerate(tmp_list):
    for idx2, k in enumerate(tmp_list):
        if idx1 == idx2:
            continue

        tmp_cost = (each[0] - k[0])**2 + (each[1] - k[1])**2
        tmp_cost = math.sqrt(tmp_cost)
        edges.append((tmp_cost,idx1+1,idx2+1))

edges.sort()

for edge in edges:
    cost, a, b = edge

    if find_parent(parent,a) != find_parent(parent,b):
        union_parent(parent,a,b)
        result += cost

print(round(result,2))

'알고리즘 > 백준' 카테고리의 다른 글

백준 11403번 경로찾기  (0) 2022.10.01
백준 14624번 - 전북대학교  (0) 2022.09.28
백준 1766번 문제집  (0) 2022.09.05
백준 1774 우주신과의 교감  (0) 2022.08.30
백준 13913번 숨바꼭질 4  (0) 2022.08.30
Comments