![]() | ![]() | ![]() |
| 그림 1: 흰색 영역 1개 | 그림 2: 흰색 영역 3개 | 그림 3: 흰색 영역 4개 |
검은 잉크 방울이 흰 종이 위에 떨어져 둥근 잉크 얼룩을 만든다. 위에 세 가지 예가 있다. 얼룩들은 종이를 여러 개의 서로 다른 흰색 영역으로 나눌 수 있다. 그림 1에는 흰색 영역이 하나뿐이다. 그림 2에는 바깥쪽 흰색 영역과, 왼쪽 얼룩 네 개로 둘러싸인 작은 흰색 영역, 그리고 오른쪽 얼룩 세 개로 둘러싸인 더 작은 흰색 영역이 있다. 그림 3에는 흰색 영역이 네 개 있다. 하나는 가장 바깥쪽, 하나는 바깥 고리 안쪽이면서 가운데 네 얼룩의 바깥쪽에 있고, 나머지 두 개는 안쪽 얼룩 네 개 중 세 개씩으로 각각 만들어지는 아주 작은 영역이다.
두 점이 같은 흰색 영역에 속한다는 것은, 두 점을 잇는 경로를 흰색 점만 지나도록 그릴 수 있다는 뜻이다. 얼룩들의 중심과 반지름이 주어질 때, 흰색 영역의 개수를 구하여라.
기하 참고. 원 $C_1$의 중심이 $(x_1, y_1)$, 반지름이 $r_1$이고, 원 $C_2$의 중심이 $(x_2, y_2)$, 반지름이 $r_2$이며, 두 원이 서로 다른 두 점에서 만난다고 하자. 두 중심 사이의 거리를 $d$, $A = \operatorname{atan2}(y_2 - y_1,; x_2 - x_1)$, $B = \arccos!\left(\dfrac{r_1^2 + d^2 - r_2^2}{2 r_1 d}\right)$라 하면, 두 교점은 $C_1$의 중심에서 양의 $x$ 방향으로 뻗은 반직선을 기준으로 반시계 방향으로 각각 $A + B$, $A - B$ 라디안 위치에 있다.
입력은 1개 이상 15개 이하의 데이터 집합으로 이루어지며, 마지막 줄에는 숫자 $0$ 하나만 있다.
각 데이터 집합은 얼룩의 개수 $n$($1 \le n \le 100$)이 적힌 줄로 시작한다. 이어서 양의 정수 $3n$개가 공백 또는 줄바꿈으로 구분되어 주어진다. 연속한 세 정수는 얼룩 하나를 나타내며, 순서대로 중심의 $x$ 좌표, $y$ 좌표, 반지름이다. 이 정수들은 모두 $1{,}000{,}000$ 이하이다.
모든 얼룩은 종이 안에 완전히 놓여 있고, 어떤 얼룩도 종이의 가장자리에 닿지 않는다. 완전히 같은 원은 없다. 서로 다른 두 원은 서로 다른 두 점에서 만나거나 전혀 만나지 않는다. 두 원이 만나면 최소 한 단위 이상 겹친다. 즉 반지름이 $r_1 \le r_2$이고 두 중심 사이 거리가 $d$일 때 $r_2 - r_1 + 1 \le d \le r_1 + r_2 - 1$이다. 세 개 이상의 원이 한 점에서 만나는 일은 없다. 어떤 원 $C$가 다른 원과 적어도 하나 만난다면, $C$ 위의 서로 다른 두 교점은 최소 $0.001$ 라디안 이상 떨어져 있다. 이 조건들 덕분에 표준 배정밀도(double) 연산으로 충분하다.
각 데이터 집합에 대해 흰색 영역의 개수를 한 줄에 출력한다. 이 개수는 $200$을 넘지 않는다.
주의. 이 문제를 무차별 래스터(픽셀 단위) 방식으로 풀면 메모리를 너무 많이 쓰고 너무 느리다.