[BOJ][๐ŸŸก5][๋ฐฑ์ค€#10216] Count Circle Groups

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #10216


๋ฌธ์ œ

๋ฐฑ์ค€์ด๋Š” ๊ตญ๋ฐฉ์˜ ์˜๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋– ๋‚ฌ๋‹ค.ย ํ˜น๋…ํ•œ ํ›ˆ๋ จ์„ ๋ฌด์‚ฌํžˆ ๋งˆ์น˜๊ณ  ๋‚˜์„œ, ์ •๋ง ์ž˜ ์ƒ๊ฒผ๊ณ  ์ฝ”๋”ฉ๋„ ์ž˜ํ•˜๋Š” ๋ฐฑ์ค€์€ ๊ทธ ํŠน๊ธฐ๋ฅผ ์‚ด๋ ค ์ ๊ตฐ์˜ ์ง„์˜์„ ์ˆ˜ํ•™์ ์œผ๋กœ ๋ถ„์„ํ•˜๋Š” ์ผ์„ ๋งก๊ฒŒ ๋˜์—ˆ๋‹ค. 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์— ๋„ฃ์–ด ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ ์›์†Œ๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด ์ถœ๋ ฅํ•˜์˜€๋‹ค.

ํ™•์‹คํžˆ ๊ณ ์ˆ˜์˜ ํ’€์ด๊ฐ€ ๋Š๊ปด์ง„๋‹ค. ์ข‹์€ ํ’€์ด์˜€๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ