본문 바로가기

Algorithm/BOJ

[BOJ] 4386. 별자리 만들기

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

 

4386번: 별자리 만들기

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

www.acmicpc.net

 

 

1. 해결방법

"""
1. 아이디어
- MST 이용
- 입력하는 2차원 배열 x, y를 입력
- 별들 사이의 거리를 계산후에 star_dis 리스트에 append
- heap에 초기값 [0, 1]을 저장
- heap이 빌때까지 반복
    - 힙의 최소값을 pop후에 해당 별 좌표의 방문 여부를 체크
    - result에 비용 추가
    - 방문하지 않았다면 방문 체크하고 해당 별의 좌표가 포함된 인접리스트를 for문으로 가져온다.
    - 인접리스트의 별 좌표를 heap을 push

2. 시간복잡도
- O(NlogN)
"""

 

 

2. 정답코드

import sys
import heapq
import math
input = sys.stdin.readline

# input
n = int(input())

edge = [[] for _ in range(n + 1)]
star_dis = [[] for _ in range(n + 1)]

for i in range(1, n + 1):
    x, y = map(float, input().split())
    edge[i].append([x, y])


# 별 거리
for i in range(1, n + 1):
    for j in range(i, n + 1):

        if i == j:
            continue
        dis = round(math.sqrt(
            (abs(edge[i][0][0] - edge[j][0][0]))**2 + (abs(edge[i][0][1] - edge[j][0][1]))**2
        ), 2)

        star_dis[i].append([dis, j])
        star_dis[j].append([dis, i])

# heap
heap = [[0, 1]]
result = 0
chk = [False] * (n + 1)

while heap:
    w, each_node = heapq.heappop(heap)

    if chk[each_node] == False:
        chk[each_node] = True
        result += w

        for next_node in star_dis[each_node]:
            if chk[next_node[1]] == False:
                heapq.heappush(heap, next_node)

print(result)
MST prim알고리즘으로 해결하였고, MST의 기본적인 문제에서 초반 도입 부분을 살짝 꼬아놓은 문제이다.
기본 문제에서는 비용이 바로 나와있었지만, 이 문제에서는 별들 사이의 거리를 math와 round 함수를 사용해서 나타내고 i, j 위치에 맞게 리스트에 append 해야한다.
그 뒤로는 일반 mst 문제와 같다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1753. 최단경로  (0) 2022.09.09
[BOJ] 16398. 행성 연결  (0) 2022.09.08
[BOJ] 1647. 도시 분할 계획  (2) 2022.09.07
[BOJ] 1922. 네트워크 연결  (0) 2022.09.07
[BOJ] 1197. 최소 스패닝 트리  (0) 2022.09.07