jh05013   4년 전

  1. 가능한 경우는 다음 6가지입니다.
    1. 두 원이 일치할 때, 답은 -1
    2. 두 원이 외접할 때, 답은 1
    3. 두 원이 내접할 때, 답은 1
    4. 두 원이 서로 떨어져 있고 만나지 않을 때, 답은 0
    5. 한 원이 다른 원의 내부에 있고 두 원이 만나지 않을 때, 답은 0. 꼭 두 원의 중심이 같을 필요는 없습니다!
    6. 나머지 경우, 답은 2
  2. 6가지 경우를 모두 넣으셨으면, 반드시 각각의 경우가 모두 잘 나오는지 직접 테스트를 해 봅시다.
  3. 두 중심 사이 거리를 R이라고 할 때, 무턱대고 R == r1 + r2인지 검사하는 것은 매우 위험합니다. 세상의 모든 실수를 정확하게 저장하는 건 불가능하기 때문에, 컴퓨터는 약간의 오차가 생기는 방식으로 실수를 저장합니다. 예를 들어 0.1을 저장하는 것만으로 이미 10-18 정도의 오차가 발생합니다. 그런데 ==은 값이 조금이라도 다르면 거짓이기 때문에, R == r1 + r2가 실제로 성립하는 일은 많지 않습니다. 마찬가지로 r1, r2 등을 float, double 등의 자료형으로 저장하면 위험합니다.
  4. R을 int 단위로 버림한 다음에 R == r1 + r2인지 검사해도 안 됩니다. 버림하는 순간 더 이상 거리가 아닙니다.
  5. R2 == r12 + r22인지 검사해도 안 됩니다. 그 식이랑 R == r1 + r2는 매우 다른 식입니다.
  6. R을 계산한 다음에 거기에 R을 곱해서 R2을 만들어도 안 됩니다. R을 계산한 순간 이미 오차가 생겼기 때문에 R2에도 오차가 생깁니다. 다행히도 R2을 오차 없이 계산하는 방법이 존재합니다. 힌트는 여기까지 드리겠습니다.

[2021년 12월 3일 수정: 3번을 조금 더 풀어서 설명했습니다.]

djs100201   4년 전

저 5번에 관해서 질문이 있습니다. 

3번에서 오차때문에 R==r1+r2인지 검사하는것은 위험하다고 하였는데

5번에서 R2 == (r1 + r2)2는 오차가 발생하지 않나요? 

대답 해주시면 감사하겠습니다.

jh05013   4년 전

R을 계산한 다음에 그 값에 R을 곱해서 R2을 만들면 오차가 생깁니다. 이미 R에 오차가 생겼기 때문입니다.

하지만 오차 없이 R2을 계산하는 방법이 있습니다.

관련 내용을 6번에 추가하겠습니다.

djs100201   4년 전

감사합니다. 도움이 되었습니다.

ehfrhfo9494   2년 전

위치가 같고 거리가 0이면 한개아닌가요? 

ex) 1 1 0 1 1 0 

은 무한으로 처리 해야 하나요 아니면 1로 처리 해야 하나요?

jh05013   2년 전

원의 둘레에 있는 모든 위치가 후보이기 때문에 무한대입니다.

ehfrhfo9494   2년 전

둘레가 0인데 어떻게 무한대인가요?

jh05013   2년 전

잘못 읽었네요. 죄송합니다.

"r1, r2는 10,000보다 작거나 같은 자연수이다."에 의해 저런 입력은 들어오지 않습니다.

ehfrhfo9494   2년 전

아 감사합니다 

댓글을 작성하려면 로그인해야 합니다.