[BOJ] 2887. ํ–‰์„ฑ ํ„ฐ๋„ (๐Ÿ’Ž, MST)

lemythe423ยท2023๋…„ 10์›” 13์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
67/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

๋ฏผํ˜์ด๋Š” ํ„ฐ๋„์„ ์ด N-1๊ฐœ ๊ฑด์„คํ•ด์„œ ๋ชจ๋“  ํ–‰์„ฑ์ด ์„œ๋กœ ์—ฐ๊ฒฐ๋˜๊ฒŒ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
์ด๋•Œ, ๋ชจ๋“  ํ–‰์„ฑ์„ ํ„ฐ๋„๋กœ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ตœ์†Œํ•œ์˜ ๊ฒฝ๋กœ, ์ตœ์†Œํ•œ์˜ ๊ฒฝ๋น„๋ฅผ ์š”๊ตฌํ•˜๋Š” ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ ๋ฌธ์ œ์ด๋‹ค.

๊ฐ ์ •์ ๋“ค ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋Š” min(|xA-xB|, |yA-yB|, |zA-zB|)๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‘ ์ •์  ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋“ค์„ x, y, z์ขŒํ‘œ ๊ฐ๊ฐ์œผ๋กœ ๊ตฌํ•œ ํ›„ ๊ทธ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ํƒํ•˜๋ฉด ๋œ๋‹ค. ๊ฐ ์ขŒํ‘œ์— ๋Œ€ํ•œ ์ •์ ๋“ค์˜ ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๊ฐ ์ขŒํ‘œ๊ฐ’๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“  ์ •์ ๋“ค์„ ์ •๋ ฌํ•œ๋‹ค. ์•„๋ž˜๋Š” x์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๊ฐ’์ด๋‹ค.

[2, [-1, -1, -5]]
[3, [10, -4, -1]]
[0, [11, -15, -15]]
[1, [14, -5, -15]]
[4, [19, -4, 19]]

์•ž์€ ๋ช‡ ๋ฒˆ์งธ ์ •์ ์ธ์ง€, ๋’ค๋Š” ๊ฐ ์ •์ ์˜ xyz ์ขŒํ‘œ ๊ฐ’์ด๋‹ค. x์ขŒํ‘œ์— ๋Œ€ํ•ด ์ •๋ ฌํ–ˆ์œผ๋ฏ€๋กœ x์ขŒํ‘œ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋‚˜ํƒ€๋‚˜๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ์ •์ ๋“ค์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋“ค์„ ์ „๋ถ€ ๊ตฌํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ด ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ์ตœ์†Œ ๋น„์šฉ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์„œ๋กœ ์ธ์ ‘ํ•œ ์ •์ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋งŒ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค. ์ฆ‰ 2๋ฒˆ ์ •์ ๊ณผ 3๋ฒˆ ์ •์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋งŒ ๊ตฌํ•˜๋ฉด ๋˜๊ณ , 2๋ฒˆ ์ •์ ๊ณผ 0๋ฒˆ ์ •์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” ๊ตณ์ด ๊ตฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์†Œ๋ฆฌ. ์–ด์ฐจํ”ผ 2๋ฒˆ ์ •์ ์—์„œ 0๋ฒˆ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ 12๋‚˜, 3๋ฒˆ ์ •์ ์„ ๊ฑฐ์ณ์„œ(11+1)๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๋‚˜ ๋˜‘๊ฐ™๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ๊ฐ ์ขŒํ‘œ ๋ณ„๋กœ ์ •๋ ฌํ•œ ํ›„ ์ธ์ ‘ํ•œ ๊ฑฐ๋ฆฌ๋“ค์„ ๊ตฌํ•œ๋‹ค. ๋ชจ๋“  ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ค ๊ตฌํ•ด์„œ ์ •์ ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฐ’์— ์•ž์— ์˜ค๋„๋ก ํ•œ ํ›„ dist ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•ด์•ผ ํ•œ๋‹ค. dist ๋ฐฐ์—ด์— ๋Œ€ํ•ด ๊ฑฐ๋ฆฌ ์ˆœ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ ํ›„ ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ์ •์ ์ด ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์†ํ•ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ฐ™์€ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๋ฅผ ๊ทธ๋ ค๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค.

import sys
input = sys.stdin.readline

def find(x):
    if parent[x] != x:
        parent[x] = find(parent[x])
    return parent[x]

def union(x, y):
    x = find(x)
    y = find(y)

    if x < y:
        parent[y] = x 
    else:
        parent[x] = y 

def find_dist(lst, k):
    global dist
    for i in range(N-1):
        x, y = lst[i][0], lst[i+1][0]
        if x < y:
            dist.append((x, y, abs(lst[i][1][k]-lst[i+1][1][k])))
        else:
            dist.append((y, x, abs(lst[i][1][k]-lst[i+1][1][k])))

N = int(input())
planet = [[i, list(map(int, input().split()))] for i in range(N)]
parent = [x for x in range(N)]
dist = []

for i in range(3):
    find_dist(sorted(planet, key=lambda x: x[1][i]), i)

dist.sort(key=lambda x: x[-1])
cost = 0
for x, y, d in dist:
    if find(x) == find(y):
        continue
    union(x, y)
    cost += d

print(cost)
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€