https://www.acmicpc.net/problem/2887
2887๋ฒ: ํ์ฑ ํฐ๋
์ฒซ์งธ ์ค์ ํ์ฑ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 โค N โค 100,000) ๋ค์ N๊ฐ ์ค์๋ ๊ฐ ํ์ฑ์ x, y, z์ขํ๊ฐ ์ฃผ์ด์ง๋ค. ์ขํ๋ -109๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 109๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ค. ํ ์์น์ ํ์ฑ์ด ๋ ๊ฐ ์ด
www.acmicpc.net
์ฒ์์๋ 1774๋ฒ(์ฐ์ฃผ์ ๊ณผ์ ๊ต๊ฐ) ๋ฌธ์ ์ฒ๋ผ ๋น์ฉ์ ๋ฐ๋ฅธ ๊ฐ์ ์ ๋ชจ๋ ์ ์ํด์ฃผ์๋ค.
ํ์ง๋ง ๋ฌธ์ ์กฐ๊ฑด์์ n์ ์๊ฐ ๊ต์ฅํ ํฌ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
import sys
input = sys.stdin.readline
def find(parent, x):
if parent[x] != x:
parent[x] = find(parent, parent[x])
return parent[x]
def union(parent, a, b):
a = find(parent, a)
b = find(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
n = int(input())
parent = [0] * (n+1)
for i in range(1, n+1):
parent[i] = i
planet = [0] * (n+1)
for i in range(1, n+1):
planet[i] = list(map(int, input().split()))
edges = []
for i in range(1, n+1):
for j in range(1, n+1):
x = abs(planet[i][0] - planet[j][0])
y = abs(planet[i][1] - planet[j][1])
z = abs(planet[i][2] - planet[j][2])
edges.append((min(x, y, z), i, j))
edges.sort()
res = 0
for i in edges:
c, a, b = i
if find(parent, a) != find(parent, b):
union(parent, a, b)
res += c
print(res)
๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ณ ๋ คํ๋ ๊ฐ์ ์ ์๋ฅผ ์ค์ฌ์ผ ํ๋ค.
๋ฌธ์ ์กฐ๊ฑด์์ ๋น์ฉ์ min(|xA-xB|, |yA-yB|, |zA-zB|)์ด๊ธฐ ๋๋ฌธ์
1. x๊ฐ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
2. ์๋ก ์ธ์ ํ ํ์ฑ์ ๋น์ฉ๋ง์ ๊ณ ๋ คํ๋ค. [i] ~ [i+1]
ใด [i] ~ [i+2]๋ [i] ~ [i+1] + [i+1] ~ [i+2] ์ ๊ฐ๊ธฐ ๋๋ฌธ์ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
3. ์ฆ, n๊ฐ์ ํ์ฑ์ ๋ํด n-1๊ฐ์ ๊ฐ์ ๋ง ๊ณ ๋ คํ๋ฉด ๋๋ค.
4. y, z์ ๋ํด์๋ ์์ ๊ฐ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ด๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ์ ์๋ฅผ ์ค์ผ ์ ์๋ค.
import sys
input = sys.stdin.readline
def find(parent, x):
if parent[x] != x:
parent[x] = find(parent, parent[x])
return parent[x]
def union(parent, a, b):
a = find(parent, a)
b = find(parent, b)
if a < b:
parent[b] = a
else:
parent[a] = b
n = int(input())
parent = [0] * (n+1)
for i in range(1, n+1):
parent[i] = i
planet = []
for i in range(1, n+1):
x, y, z = map(int, input().split())
planet.append((i, x, y, z))
edges = []
for i in range(1, 4):
planet.sort(key=lambda x: x[i]) # x๊ฐ, y๊ฐ, z๊ฐ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for j in range(n-1):
edges.append((abs(planet[j+1][i]-planet[j][i]), planet[j][0], planet[j+1][0])) # ๊ฐ์ ์ ๋ณด ์ถ๊ฐ
edges.sort() # ๋น์ฉ ์์ผ๋ก ์ ๋ ฌ
res = 0
for i in edges:
c, a, b = i
if find(parent, a) != find(parent, b):
union(parent, a, b)
res += c
print(res)
'๐ค > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1766: ๋ฌธ์ ์ง (Python) (0) | 2022.08.05 |
---|---|
๋ฐฑ์ค 2252: ์ค ์ธ์ฐ๊ธฐ (Python) (0) | 2022.08.05 |
๋ฐฑ์ค 1774: ์ฐ์ฃผ์ ๊ณผ์ ๊ต๊ฐ (Python) (0) | 2022.08.04 |
๋ฐฑ์ค 1197: ์ต์ ์คํจ๋ ํธ๋ฆฌ (Python) (0) | 2022.07.29 |
๋ฐฑ์ค 4195: ์น๊ตฌ ๋คํธ์ํฌ (Python) (0) | 2022.07.28 |