- toc {:toc}
๋ฌธ์
์กฐ๊ทํ๊ณผ ๋ฐฑ์นํ์ ํฐ๋ ์ ๊ทผ๋ฌดํ๋ ์ง์์ด๋ค. ํ์ง๋งย ์๋ ์กด์ฌ๊ฐ์ด ์์ด์ ์ธ๊ตฌ์๋ ์ฐจ์งํ์ง ์๋๋ค. ๋ค์์ ์กฐ๊ทํ๊ณผ ๋ฐฑ์นํ์ ์ฌ์ง์ด๋ค.

์ด์์์ ์กฐ๊ทํ๊ณผ ๋ฐฑ์นํ์๊ฒ ์๋ํธ ๋ง๋ฆฐ(๋ฅ์ฌ๋ช )์ ์์น๋ฅผ ๊ณ์ฐํ๋ผ๋ ๋ช ๋ น์ ๋ด๋ ธ๋ค. ์กฐ๊ทํ๊ณผ ๋ฐฑ์นํ์ ๊ฐ๊ฐ ์์ ์ ํฐ๋ ์์น์์ ํ์ฌ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ค.
์กฐ๊ทํ์ ์ขํ (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
<ํ์ด>
- ๋ ์์ ์ ์ ์ ์ฐพ์ผ๋ฉด ๋๋ ๋ฌธ์ .
- 6๊ฐ์ง ์ผ์ด์ค๋ฅผ ๋๋์ด ๊ต์ ์ด 2๊ฐ, 1๊ฐ, 0๊ฐ ์ผ ๋๋ฅผ ๋น๊ตํด ํ๋ฉด ๋๋ ๋ฌธ์
- ๋ค๋ง, ํจ์ ์ด ์กด์ฌํจ. ์ปดํจํฐ ๊ณ์ฐ์์ ๋ฐ์ํ๋ ๋ถ๋์์์ ์ค๋ฅ๊ฐ ์กด์ฌ.
์ง๊ด์ ์ผ๋ก 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;
}