[BOJ][๐ก5][๋ฐฑ์ค#10216] Count Circle Groups
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋ฐฑ์ค์ด๋ ๊ตญ๋ฐฉ์ ์๋ฌด๋ฅผ ์ํํ๊ธฐ ์ํด ๋ ๋ฌ๋ค.ย ํน๋ ํ ํ๋ จ์ ๋ฌด์ฌํ ๋ง์น๊ณ ๋์, ์ ๋ง ์ ์๊ฒผ๊ณ ์ฝ๋ฉ๋ ์ํ๋ ๋ฐฑ์ค์ ๊ทธ ํน๊ธฐ๋ฅผ ์ด๋ ค ์ ๊ตฐ์ ์ง์์ ์ํ์ ์ผ๋ก ๋ถ์ํ๋ ์ผ์ ๋งก๊ฒ ๋์๋ค. 2์ฐจ์ ํ๋ฉด ์์ย N๊ณณ์ย ์ ๊ตฐ์ ์ง์์ด ์ค์น๋์ด ์๋ค.ย ๊ฐ ์ ๊ตฐ์ ์ง์๋ค์ ์ง์๋ง๋ค ํ๋์ ํต์ ํ์ ์ค์นํด, i๋ฒ์งธ ์ ๊ตฐ์ ํต์ ํ์ ์ค์น ์์น๋ก๋ถํฐ Riย ์ด๋ด ๊ฑฐ๋ฆฌ์ ํฌํจ๋๋ ๋ชจ๋ ์ง์ญ์ ์์ ์ ํต์ ์์ญ Ai๋ก ๊ฐ์ง๊ฒ ๋๋ค.ย ๋ง์ฝ ์์์ ํต์ ์์ญ Ai์ Aj๊ฐ ๋ฟ๊ฑฐ๋ ๊ฒน์น๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์ง์ i์ ์ง์ j๋ ์ง์ ์ ์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ๋ค. ๋ฌผ๋ก ์ง์ ์ ์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ์ง ์๋๋ผ๋, ์์์ ์ง์ญ i์ j๊ฐ ์ค๊ฐ์ ๋ช ๊ฐ์ ์ง์ ํต์ ์ ๊ฑฐ์ณ์ ์ต์ข ์ ์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ๋ค๋ฉดย i์ j๋ ์ํธ๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณธ๋ค. ์ ๋ค์ ์๋ฆฌํด์, ์ํธ๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํ ๋ถ๋๋ผ๋ฆฌ๋ ๊ฒฐ์ง๋ ฅ์๋ ํ ๊ทธ๋ฃน์ฒ๋ผ ํ๋ํ๋ค. ๋ฐฑ์ค์ ์ด๋ฌํ ๊ทธ๋ฃน์ ๊ฐ์๋ฅผ ์์๋ด ์๊ตฐ์ ์ ๋ต์ง์นจ์ ๋์์ ์ฃผ๊ณ ์ ํ๋ค.ย ๊ตฐ๋์ ๊ฐ์๋ ์ฝ๋ฉํ๋ ๋ถ์ํ ๋ฐฑ์ค์ ์ํด ์ ๊ตฐ์ ํต์ ๋ง ๋ถ์์ ๋์์ฃผ์!
์ ๋ ฅ
์ ๋ ฅ ํ์ผ์ ์ฒซ ๋ฒ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ์๋ฅผ ์๋ฏธํ๋ ์์ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์์๋ T๊ฐ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์ ์ ๊ตฐ ์ง์์ ์ซ์ N (1 โค N โค 3,000)์ด ์ฃผ์ด์ง๋ค.ย ์ด์ด์ N์ค์ ๊ฑธ์ณ ์ ๊ตฐ ์ง์์ ์ขํ x, y (0 โค x, y โค 5,000), ๊ทธ๋ฆฌ๊ณ ํด๋น ์ง์์ R (0 โค R โค 5,000)์ด ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง๋ ์๋ ๋ชจ๋ ์ ์์ด๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์ ํ ์ค์ ๊ฑธ์ณ ์ ๊ตฐ ์ง์์ ๊ทธ๋ฃน ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
2
2
0 0 1
1 0 1
3
0 0 1
2 0 1
10 0 5
์ถ๋ ฅ
1
2
My Sol
import sys
input = sys.stdin.readline
def calcD(c1, c2):
return ((c1[0]-c2[0])**2 + (c1[1]-c2[1])**2)
def dfs(i):
for j in range(N):
if i == j or visit[j]: continue
if calcD(cs[i], cs[j]) > (cs[i][2]+cs[j][2])**2: continue
visit[j] = 1
dfs(j)
T = int(input())
for _ in range(T):
N = int(input())
cs = [list(map(int, input().split())) for _ in range(N)]
cnt = 0
visit = [0]*N
for i in range(N):
if visit[i]: continue
dfs(i)
cnt += 1
print(cnt)
dfs๋ฅผ ์ด์ฉํ์๋ค.
์ฐ์ ํ ์์ ๊ธฐ์ค์ผ๋ก ์ด๋ ํ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ๊ฐ์ด ๋ ์์ ๋ฐ์ง๋ฆ์ ํฉ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ ํ ๊ทธ๋ฃน์ผ๋ก ์ทจ๊ธํ ์ ์๋ค. ๋๋ฌธ์ ํด๋น ์ธ์ ํ ์์ ์ฐพ๊ฒ ๋๋ฉด ๊ทธ ์์ผ๋ก๋ถํฐ ๋ค๋ฅธ ์๋ค์ ์ธ์ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฐฉ์์ผ๋ก ์ฐ์์ ์ผ๋ก ์ค์ํ๋ค.
์ด๋ ํ ๋ฒ ํ์ธํ ์์ ๋ค์ ํ์ธํ์ง ์๊ธฐ ์ํด visit์ ์ด์ฉํด ํ ๊ทธ๋ฃน์ ๋ชจ๋ ์กฐํํ๋ ๊ฒฝ๋ก์ ์์ ๋ชจ๋ visit์ ์ฒดํฌํ๊ณ ํด๋น dfs๋ฅผ ๋ชจ๋ ๋ง์น๋ฉด ํ ๊ทธ๋ฃน์ ๋ํ ์กฐ์ฌ๋ฅผ ๋ง์น ๊ฒ์ด๊ธฐ ๋๋ฌธ์ cnt๋ฅผ 1 ์ถ๊ฐํด์ค๋ค.
์ฒ์์๋ ์์ ๋ฒ์๋ฅผ ๋ชจ๋ 1์ ์ฒดํฌํ๋ฉฐ ์์ ํ์ + bfs๋ฅผ ํด๋ณผ๊น ํ๋๋ฐ, ๊ทธ๋ด ๊ฒฝ์ฐ์ ๋งต์ ํฌ๊ธฐ๊ฐ 5000x5000์ธ๋ฐ ๋ค๊ฐ ๋ฒ์์ ์๊ฐ 3000์ผ๋ก ์๊ฐ ๋ณต์ก๋์์ ๋ถ๊ฐ๋ฅํ ๋ฐฉ์์ด์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
์๊ณผ ์ ์ฌ์ด์ ์ธ์ ์ฌ๋ถ๋ฅผ ์ค์ฌ์ ์ ์ขํ์ ๋ฐ์ง๋ฆ์ผ๋ก ๊ณ์ฐํ๋ ๋ฐฉ์๊น์ง๋ ๊ณ ๋ฏผํ์ฌ ์ฐพ์๋ด์์ผ๋, ์ ์ ์๋ ์ด์ ๋ก ์ค๋ฅ๋ฅผ ๊ฒช์ด ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ์๋ค. ๊ฒฐ๊ตญ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๋๋ฐ, dfs ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์กฐ๊ธ ๋ฌ๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์ dfs ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๋ฐ๋ ์๊พธ ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ ๊ฒ์ด์๋ค. ์์ด๋์ด์์ ํํธ๋ง ์ป์์ ๋ฟ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ ๋ถ์ํด๋ณด๋, ๊ธธ์ด๋ฅผ ๊ตฌํ ๋ x ๋ณํ๋์ ์ ๊ณฑ๊ฐ๊ณผ y ๋ณํ๋์ ์ ๊ณฑ๊ฐ์ ํฉ์ ์ ๊ณฑ๊ทผ์ด ๊ฑฐ๋ฆฌ์ธ๋ฐ, ๋๋ ์ฌ๊ธฐ๊น์ง calcD ํจ์์์ ์ฒ๋ฆฌํด์ค ๋ฐ๋ฉด, ๋ธ๋ก๊ทธ์์๋ ๋ฐ์ง๋ฆ์ ํฉ์ ์ ๊ณฑ์ ์ทจํด์ค ๊ฒ์ด๋ค. ์ด๊ฒ๋ง ๋ฐ๊พธ์๋๋ฐ ์๊ฐ์ด ํฉ๊ฒฉ์ ์ด์๋ค.
์ด๊ฒ์ด ์ฐ์ฐ์๊ฐ์ ์ฐจ์ด๋ฅผ ๋ง๋ค ๊ฒ์ด๋ผ ์๊ฐ์น๋ ๋ชปํ๋ค. ๋๋ฌด ์์ธ์ ๊ฒฐ๊ณผ์๋ค.
๋ชจ๋ฒ๋ต์
from functools import cmp_to_key
import copy
from itertools import combinations, permutations
from collections import deque, defaultdict
import heapq
import math
from bisect import bisect_left, bisect_right
from sys import stdin, stdout, setrecursionlimit, exit
INF = float('inf')
MOD = 1000000007
def uff(a):
if parent[a] == a:
return a
parent[a] = uff(parent[a])
return parent[a]
def ufu(a, b):
pa = uff(a)
pb = uff(b)
if pa != pb:
parent[pa] = pb
t = int(stdin.readline())
for _ in range(t):
n = int(stdin.readline())
parent = [i for i in range(n)]
tower = []
for i in range(n):
x,y,r1 = map(int, stdin.readline().split())
for j in range(i):
a,b,r2 = tower[j]
if (x-a)**2 + (y-b)**2 <= (r1+r2)**2:
ufu(i,j)
tower.append((x,y,r1))
ans = set()
for i in range(n):
ans.add(uff(i))
stdout.write(f"{len(ans)}\n")
์ฐ์ฐ์๊ฐ์ด ์ ๋ฐ์ ํด๋นํ๋ ์ฝ๋ํฌ์ค ๋ธ๋ฃจ ์ ์ ์ ํ์ด๋ฅผ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ์จ๊ฐ ํน์ดํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํ์ด๋ด์ จ๋ค.
์ฐ์ ๋์ ๋๋ ๊ฒ์ ์ ๋์จ ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ๋ค๋ ์ ์ด๋ค. ํ ์์ ์ ๋ณด๋ฅผ ๋ฐ์ผ๋ฉด, ์ด์ ๊น์ง์ ์์ ์ ๋ณด๋ฅผ ๋ด์ tower ๋ฐฐ์ด์์ ๊ฐ๊ฐ์ ์๋ค์ ๋น๊ตํ๋ค. ๋ง์ฝ ์์ญ์ด ์ธ์ ํ๊ฑฐ๋ ๊ฒน์น๋ค๋ฉด ์ ๋์จํ์ธ๋๋ฅผ ์ด์ฉํด ์ต์์ ๋ฃจํธ๋ฅผ ๊ฐ๊ฒ ์ฒ๋ฆฌํด์ฃผ์๋ค.
์ดํ 0๋ถํฐ n-1๊น์ง์ ์ธ๋ฑ์ค์ ๋ํด ๋ฃจํธ ๋ ธ๋ ๋ฒํธ๋ฅผ set์ ๋ฃ์ด ์ค๋ณต์ ์ ๊ฑฐํ ์์๋ค์ ๊ฐ์๋ฅผ ์ธ์ด ์ถ๋ ฅํ์๋ค.
ํ์คํ ๊ณ ์์ ํ์ด๊ฐ ๋๊ปด์ง๋ค. ์ข์ ํ์ด์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ