본문 바로가기
백준

백준 10216 Count Circle Groups

by 콩순이냉장고 2020. 10. 2.

문제 URL :www.acmicpc.net/problem/10216

 

10216번: Count Circle Groups

백준이는 국방의 의무를 수행하기 위해 떠났다. 혹독한 훈련을 무사히 마치고 나서, 정말 잘 생겼고 코딩도 잘하는 백준은 그 특기를 살려 적군의 진영을 수학적으로 분석하는 일을 맡게 되었��

www.acmicpc.net

 

문제접근법 : 수학적인 접근이 필요합니다. 두원의 위치관계만 알고 union- find만 해주면되기 때문에

어려운 문제는 아닙니다.

 

대표적으로 두원의 위치관계를 풀기위한 문제는 www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

터렛 문제가 대표적이니 한번 풀어보시길 바랍니다.

 

두 원의 위치관계

이 이미지는 mathbang.net/101에서 가져왔습니다.

결국엔 거리 d가 반지름 r1+r2보다 크면 만나지않고 그외는 모두 원이 만나거나 내부에 포함하기 때문에 4번식 한가지만 선택해서 풀었습니다.

소스코드 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//By 콩순이냉장고
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <tuple>
#include <cmath>
using namespace std;
vector<tuple<intintint>> v;
int parent[3001];
int find(int idx){
    if (idx == parent[idx])
        return idx;
    return parent[idx] = find(parent[idx]);
}
int Distance(int x1, int y1, int x2, int y2)
{
    return (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2);
}
void Union(int idx1, int idx2){
    idx1 = find(idx1);
    idx2 = find(idx2);
    if (idx1 == idx2)
        return;
    parent[idx2] = idx1;
}
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int test;
    cin >> test;
    while (test--){
        v.clear();
        int n;
        cin >> n;
        int visit[3001= { 0 };
        for (int i = 0; i < n; i++){
            int x, y, r;
            cin >> x >> y >> r;
            v.push_back(make_tuple(x, y, r));
            parent[i] = i;
        }
        for (int i = 0; i < n - 1; i++)
        {
            for (int j = i + 1; j < n; j++)
            {
                int x1, y1, r1;
                int x2, y2, r2;
                tie(x1, y1, r1) = v[i];
                tie(x2, y2, r2) = v[j];
                int dis = Distance(x1, y1, x2, y2);
                int t = (r1 + r2)*(r1 + r2);
                if (t < dis)
                    continue;
                Union(i, j);
            }
        }
        int cnt = 0;
        for (int i = 0; i < n; i++){
            visit[find(i)]++;
        }
        for (int i = 0; i < n; i++)
        {
            if (visit[i])
                cnt++;
        }
        cout << cnt << "\n";
    }
 
}
 
 
cs

모르는점 혹은 궁금한점 혹은 논리적인 오류가 있다면 언제든지 댓글을 이용해주시길 바랍니다.

 

'백준' 카테고리의 다른 글

백준 1107 리모컨  (0) 2020.11.29
백준 16562 친구비  (0) 2020.10.02
백준 5373 큐빙(SW 역량 테스트 기출 문제)  (0) 2020.09.21
백준 4195 친구 네트워크  (0) 2020.08.30
백준 4386 별자리 만들기  (0) 2020.08.30