• toc {:toc}

๋ฌธ์ œ

์กฐ๊ทœํ˜„๊ณผ ๋ฐฑ์Šนํ™˜์€ ํ„ฐ๋ ›์— ๊ทผ๋ฌดํ•˜๋Š” ์ง์›์ด๋‹ค. ํ•˜์ง€๋งŒย ์›Œ๋‚™ ์กด์žฌ๊ฐ์ด ์—†์–ด์„œ ์ธ๊ตฌ์ˆ˜๋Š” ์ฐจ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ์€ ์กฐ๊ทœํ˜„๊ณผ ๋ฐฑ์Šนํ™˜์˜ ์‚ฌ์ง„์ด๋‹ค.

https://www.acmicpc.net/upload/201003/dfcmhrjj_142c3w76qg8_b.jpg

์ด์„์›์€ ์กฐ๊ทœํ˜„๊ณผ ๋ฐฑ์Šนํ™˜์—๊ฒŒ ์ƒ๋Œ€ํŽธ ๋งˆ๋ฆฐ(๋ฅ˜์žฌ๋ช…)์˜ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•˜๋ผ๋Š” ๋ช…๋ น์„ ๋‚ด๋ ธ๋‹ค. ์กฐ๊ทœํ˜„๊ณผ ๋ฐฑ์Šนํ™˜์€ ๊ฐ๊ฐ ์ž์‹ ์˜ ํ„ฐ๋ › ์œ„์น˜์—์„œ ํ˜„์žฌ ์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ–ˆ๋‹ค.

์กฐ๊ทœํ˜„์˜ ์ขŒํ‘œ (x1, y1)์™€ ๋ฐฑ์Šนํ™˜์˜ ์ขŒํ‘œ (x2, y2)๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ์กฐ๊ทœํ˜„์ด ๊ณ„์‚ฐํ•œ ๋ฅ˜์žฌ๋ช…๊ณผ์˜ ๊ฑฐ๋ฆฌ r1๊ณผ ๋ฐฑ์Šนํ™˜์ด ๊ณ„์‚ฐํ•œ ๋ฅ˜์žฌ๋ช…๊ณผ์˜ ๊ฑฐ๋ฆฌ r2๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฅ˜์žฌ๋ช…์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

ํ•œ ์ค„์— x1, y1, r1, x2, y2, r2๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. x1, y1, x2, y2๋Š” -10,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜์ด๊ณ , r1, r2๋Š” 10,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๋ฅ˜์žฌ๋ช…์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฅ˜์žฌ๋ช…์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ฌดํ•œ๋Œ€์ผ ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ถœ์ฒ˜:https://www.acmicpc.net/problem/1002

<ํ’€์ด>

  1. ๋‘ ์›์˜ ์ ‘์ ์„ ์ฐพ์œผ๋ฉด ๋˜๋Š” ๋ฌธ์ œ.
  2. 6๊ฐ€์ง€ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆ„์–ด ๊ต์ ์ด 2๊ฐœ, 1๊ฐœ, 0๊ฐœ ์ผ ๋•Œ๋ฅผ ๋น„๊ตํ•ด ํ’€๋ฉด ๋˜๋Š” ๋ฌธ์ œ
  3. ๋‹ค๋งŒ, ํ•จ์ •์ด ์กด์žฌํ•จ. ์ปดํ“จํ„ฐ ๊ณ„์‚ฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ถ€๋™์†Œ์ˆ˜์  ์˜ค๋ฅ˜๊ฐ€ ์กด์žฌ.

์ง๊ด€์ ์œผ๋กœ 0.1 + 0.2 == 0.3 -> false ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

0.1 + 0.2 -> 0.30000000000000004 ์ด๊ธฐ ๋•Œ๋ฌธ์— sqrt๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ

R = r1+r2๋กœ ์ •์˜ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. R๊ฐ’์ด ์ด๋ฏธ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โ‡’ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ œ๊ณฑ๊ฐ’์œผ๋กœ ์ •์˜ํ•˜๋ฉด์„œ ์˜ค์ฐจ์—†์ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค.

์ฐธ๊ณ (ํ„ฐ๋ › ํžŒํŠธ):https://www.acmicpc.net/board/view/38854

์ฐธ๊ณ (๋ถ€๋™์†Œ์ˆ˜์  ์˜ค๋ฅ˜):https://stackoverflow.com/questions/588004/is-floating-point-math-broken

#include <iostream>
#include <cmath>
 
using namespace std;
 
struct Round
{
	int x;
	int y;
	int r;
};
 
int main() 
{
  	int T, x1, y1, r1, x2, y2, r2, D, sumR, subR;
	Round a, b;
	cin >> T;
	for(int i=0; i<T; i++)
	{
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		a.x = x1;	a.y = y1;	a.r = r1;
		b.x = x2;	b.y = y2;	b.r = r2;
		if(a.x==b.x&&a.y==b.y&&a.r==b.r)
		{
			cout << -1 << endl;
			continue;
		}
		D = pow(abs(a.x-b.x),2)+pow(abs(a.y-b.y),2);
		sumR = pow(a.r + b.r,2);
		subR = pow(abs(a.r-b.r),2);
		if(D>sumR||D<subR)
		{
			cout << 0 << endl;
			continue;
		}
		else if(D==sumR||D==subR)
		{
			cout << 1 << endl;
			continue;
		}
		else
		{
			cout << 2 << endl;
			continue;
		}
		
	}
	
	return 0;
}