fred1991   2년 전

어린왕자 문제인데... 결과는 맞게 나오는데, 채점은 계속 틀린다고 나오네요.

일단 [meter = 두 점 사이의 거리]를 말하는 거고. r1, r2는 반지름(반경)인데

1. 두 원이 서로 멀리 떨어져 있는 경우(meter > (r1 + r2))에는 출력을 0으로
2. 두 원이 딱 맞닿아 있는 경우(meter == (r1 + r2))는 출력이 1,
3. 두 원이 교차해있다면(meter > 0 && meter < (r1 + r2)) 출력을 2로 설정했습니다.
4. 여기에 두 원이 같은 중점을 공유할 경우((x2 == x1) && (y2 == y1))
--한 원이 다른 원보다 크다면((r1 > r2) || (r1 < r2)) 출력을 0으로
--두 원이 크기가 똑같다면(r1 == r2) 출력을 -1로 했습니다.

일단 이렇게 해놓았는데 뭐가 문제일까요?


djm03178   2년 전

한 원이 다른 원 안에 중심점은 다르지만 들어있는 경우가 고려되지 않은 것 같습니다.

2

0 0 100 1 1 1

0 0 2 1 0 1

위는 완전히 안에 포함됐으므로 0이고, 아래는 내접하므로 1이어야 하는데 둘 다 2가 출력됩니다.

fred1991   2년 전

답변 감사드립니다. 말씀하신대로 결함있는 부분을 다음과 같이 고쳤습니다.

if(meter > (r1 + r2)) cross[i] = 0;
else if(meter == (r1 + r2)) cross[i] = 1;
else if((meter > Math.abs(r1 - r2)) && (meter < (r1 + r2))) cross[i] = 2;
else if((meter < Math.abs(r1 - r2)) && (meter > 0)) cross[i] = 0;
else if((meter == Math.abs(r1 - r2))){
if((r1 > r2) || (r1 < r2)) cross[i] = 1;
else cross[i] = -1;
}
else if(meter == 0) {
if((r1 > r2) || (r1 < r2)) cross[i] = 0;
else cross[i] = -1;
}

위의 결과 입력해서 각각 0, 1 나오는 것까지 확인했는데, 계속 틀렸다고 나오네요. 제가 뭔가 빠뜨린 게 있을까요?

djm03178   2년 전

거리를 int형으로 잘라버리는 것이 문제인 것 같습니다.

1

0 0 100 300 401 400

이 경우 거리는 500이 소수점 단위로 조금 넘는 게 맞는데 int형으로 잘라버리면서 그냥 500이 되어버렸기 때문에 원이 접한다고 판단해버립니다.

개인적으로, 이런 문제에서 sqrt를 사용하는 것은 추천하지 않습니다. 부동소수점 수들의 한계상 오차가 발생할 가능성이 있기 때문입니다. 차라리, meter를 sqrt하기보다 반지름들을 더하거나 뺀 값을 제곱해서 비교하는 것이 나은 것 같습니다.

fred1991   2년 전

아이고! 말씀하신대로 제곱처리했더니 맞게 나오네요.

드디어 해결되었네요. 정말 감사드립니다!!

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