[BOJ][๐ก3][๋ฐฑ์ค#14621] ๋๋ง ์๋๋ ์ฐ์
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๊นฝ๋ฏธ๋ 24์ด ๋ชจํ์๋ก์ด๋ค. ๊นฝ๋ฏธ๋ ๋๋ง๋ฒ์ฌ๊ฐ ๋ ์ ์๋ค๋ฉฐ ์์ ์ ํ๋ก๊ทธ๋๋ฐ ๋ฅ๋ ฅ์ ์ด์ฉํ์ฌ ๋ฏธํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ๋ฏธํ ์ฑ์ ๋ํ์์ ํ๊ฒ์ผ๋ก ๋ง๋ค์ด์ก์ผ๋ฉฐ ๋ํ๊ต๊ฐ์ ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ๋ง๋ค์๋ค. ์ด ์ฑ์ ์ฌ์ฉ์๋ค์ ์ํด ์ฌ์ฌ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ๋ค. ์ด ๊ฒฝ๋ก๋ 3๊ฐ์ง ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
์ฌ์ฌ ๊ฒฝ๋ก๋ ์ฌ์ฉ์๋ค์ ์ฌ์ฌ์ ๋ง์กฑ์ํค๊ธฐ ์ํด ๋จ์ด ๋ํ๊ต์ ์ฌ์ด ๋ํ๊ต๋ค์ ์ฐ๊ฒฐํ๋ ๋๋ก๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฌ์ฉ์๋ค์ด ๋ค์ํ ์ฌ๋๊ณผ ๋ฏธํ ํ ์ ์๋๋ก ์ด๋ค ๋ํ๊ต์์๋ ๋ชจ๋ ๋ํ๊ต๋ก ์ด๋์ด ๊ฐ๋ฅํ ๊ฒฝ๋ก์ด๋ค. ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ ๋ฏธํ ํ ์ ์๋๋ก ์ด ๊ฒฝ๋ก์ ๊ธธ์ด๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋์ด์ผ ํ๋ค.
๋ง์ฝ ๋๋ก ๋ฐ์ดํฐ๊ฐ ๋ง์ฝ ์ผ์ชฝ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค๋ฉด, ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ ๋ณด๋ผ์ ์ ๊ณผ ๊ฐ์ด ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๋ฉด ์์ 3๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ๋ก๋ฅผ ๋ง๋ค ์ ์๋ค.
์ด๋, ์ฃผ์ด์ง๋ ๊ฑฐ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฌ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ํ๊ต์ ์ N์ ํ๊ต๋ฅผ ์ฐ๊ฒฐํ๋ ๋๋ก์ ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค. (2 โค N โค 1,000) (1 โค M โค 10,000) ๋์งธ ์ค์ ๊ฐ ํ๊ต๊ฐ ๋จ์ด ๋ํ๊ต๋ผ๋ฉด M, ์ฌ์ด ๋ํ๊ต๋ผ๋ฉด W์ด ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์ u v d๊ฐ ์ฃผ์ด์ง๋ฉฐ uํ๊ต์ vํ๊ต๊ฐ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ ์ด ๊ฑฐ๋ฆฌ๋ d์์ ๋ํ๋ธ๋ค. (1 โค u, v โค N) , (1 โค d โค 1,000)
์ถ๋ ฅ
๊นฝ๋ฏธ๊ฐ ๋ง๋ ์ฑ์ ๊ฒฝ๋ก ๊ธธ์ด๋ฅผ ์ถ๋ ฅํ๋ค. (๋ชจ๋ ํ๊ต๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒฝ๋ก๊ฐ ์์ ๊ฒฝ์ฐ -1์ ์ถ๋ ฅํ๋ค.)
์์
์ ๋ ฅ
5 7
M W W W M
1 2 12
1 3 10
4 2 5
5 2 5
2 5 10
3 4 3
5 4 7
์ถ๋ ฅ
34
My Sol
import sys
input = sys.stdin.readline
from heapq import heappop, heappush
def find_x(x):
if x!= p[x]:
x = find_x(p[x])
return x
V, E = map(int, input().split())
G = [''] + list(input().split())
p = [i for i in range(V+1)]
Q = []
for _ in range(E):
u, v, w = map(int, input().split())
heappush(Q, (w, u, v))
cnt = 0
ssum = 0
while cnt < V-1 and Q:
w, u, v = heappop(Q)
if G[u] == G[v]: continue
a, b = find_x(u), find_x(v)
if a == b: continue
p[a] = b
cnt += 1
ssum += w
ret = ssum if cnt == V-1 else -1
print(ret)
์ ๋์จํ์ธ๋์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๋ฌธ์ ์๋ค. ํน์ดํ๋ ์ ์ ๋ ๋ ธ๋๊ฐ ๊ฐ์ ์ฑ๋ณ์ด๋ฉด ์ ๋๋ค๋ ์กฐ๊ฑด์ด์๋๋ฐ, ์ฑ๋ณ ์ ๋ณด๋ฅผ ๋ด์ G ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ ๋ ธ๋ u, v์ ๊ฐ์ ๋น๊ตํด ๊ฐ์ผ๋ฉด ๋ค์ ๊ฐ์ ์ ๋ณด๋ฅผ ์์ํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ์ ์์๋ค.
ํน๋ณํ ์ด๋ ค์ธ ๊ฒ์ ์์๋ ๋ฌธ์ ์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys
input = sys.stdin.readline
def find(u):
if u != unionfind[u]:
unionfind[u] = find(unionfind[u])
return unionfind[u]
def union(u, v):
root1 = find(u)
root2 = find(v)
unionfind[root2] = root1
def kruskal():
edges = 0
dist = 0
while True:
if edges == v-1: break
if len(graph) == 0:
print(-1)
sys.exit(0)
u, ve, w = graph.pop()
if find(u) != find(ve):
union(u, ve)
dist += w
edges += 1
return dist
v, e = map(int, input().split())
l = input().rstrip().split()
graph = []
for _ in range(e):
a, b, c = map(int, input().split())
if l[a-1] != l[b-1]:
graph.append((a,b,c))
graph.sort(key = lambda x : -x[2])
unionfind = [0]
for i in range(1, v+1):
unionfind.append(i)
print(kruskal())
์ฐ์ฐ์๊ฐ์ด 70% ์ ๋์ธ ๋ฌธ์ ํ์ด๋ฅผ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ๋ค๋ฅธ ์ ๊ทผ์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ ์ฒ์์ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ฐ์ ๋๋ถํฐ ์ฑ๋ณ ์ ๋ณด๋ฅผ ํ์ธํ์ฌ ๊ฐ์ ์ฑ๋ณ์ด๋ผ๋ฉด ๊ฐ์ ์ ๋ณด ํ์ ๋ฃ์ง ์๋ ๋ฐฉ์์ด๋ค. ์ด๋ฅผ ํตํด ํผํฌ๋จผ์ค๊ฐ ์ข์์ง๋๊ฐ ์๊ฐํด๋ณด๋ฉด ์๋ ๊ฒ ๊ฐ๋ค. ๋ฐ์ ๋ ํ์ธํ๋ ๋๋ฆด ๋ ํ์ธํ๋ ์กฐ์ผ๋ชจ์ฌ์ด๋ค. ๋ฐ์ ๋ ์ฑ๋ณ์ด ๋ค๋ฅธ์ง๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ฒดํฌํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ์ฐ์ฐ์ด ์์ด ํฐ ์ฐจ์ด๋ ์์ ๊ฒ์ด๋ค.
๋๋ heap์ ์ด์ฉํด ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๊ฐ์ ์ heappopํ๋ ๋ฐฉ์์ ํ์ฉํ๋๋ฐ, ์ด ๋ถ์ lambda๋ฅผ ์ด์ฉํ sort๋ฅผ ์ฌ์ฉํ์ จ๋ค. heap์์ ๊ฐ์ฅ ์์ ๊ฐ์ ์ฐพ์ 1๋ฒ ์์น์ ๋ฐฐ์นํ๊ณ ์ด๊ฒ์ด heappop๋ ๋๋ง๋ค O(log N)์ ์๊ฐ๋ณต์ก๋๋ก ์ฌ์ ๋ ฌํ๋๋ฐ, ์ด ๋๋ฌธ์ธ๊ฐ ์ถ์ด sort()๋ฅผ ์ด์ฉํด๋ณด์๋ ์๊ฐ ์ฐจ์ด๊ฐ ํฌ์ง ์์๋ค.(๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ 5% ์ ๋ ๊ฐ์ํ๋ค.)
๊ทธ ์ธ์๋ ๋ก์ง ๊ตฌ์ฑ์ด ๋ชจ๋ ๊ฐ์๋ฐ ๋น ๋ฅธ ์ด์ ๋ฅผ ์ ์๊ฐ ์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ