swo98   2년 전

입력예시 복사해서 붙이면 0이라고 나와버리는데

로직은 맞게 짠거같은데 뭐가 틀린지 모르겠어요;;;

while문 안에서 값들 하나하나 찍어보면 잘 나오는데 분기문에 안걸러지고

무조건 result = 0 나오네요 ㅠㅠ

themion   2년 전

1. d를 갱신하신 뒤 plus와 minus를 갱신하지 않으신 것 같습니다.

2. result를 출력하신 뒤 줄바꿈을 해 주셔야 합니다.

3. 두 중심 사이의 거리는 정수가 아닐 수도 있습니다. 예) (0, 0)과 (1, 1)


swo98   2년 전

답변 감사합니다

근데 혹시 갱신하지 않았다는게 무슨뜻인가요? 초기화를 말씀하시는건가요?

themion   2년 전

1번, 그러니까 plus와 minus를 갱신하지 않았다는 얘기는, plus와 minus가 테스트 케이스를 입력받은 이후에 그 테스트 케이스에 맞는 값으로 설정되지 않았다는 이야기입니다.

x1부터 r2까지 입력받은 다음에 그 값으로 plus와 minus의 값을 설정해야 하는데, 두 변수를 선언한 이후에만 값을 바꾸고 x1부터 r2까지 입력받은 이후에는 그 값을 바꾸지 않아 각 테스트 케이스에 맞는 값을 사용하지 못해 오류가 발생하게 됩니다.

참고로, 값이 정의되지 않은 변수를 이용하는 것은 위험합니다. 변수를 선언한 뒤 값을 넣어주지 않으면 임의의 값이 저장되는데, 이 상태로 변수를 이용하면 원치 않는 결과를 얻기 쉽습니다.

swo98   2년 전

아하그러네요!!

근데 아래처럼 코드수정해서 결과 잘 나오는데 제출하면 틀렸다고 나오네요....

int d;
int plus,minus;
// 두 점 사이 거리
d = sqrt(pow(x2-x1,2)+pow(y2-y1,2));

cin>>n;
while(n--){
cin>>x1>>y1>>r1>>x2>>y2>>r2;

int d = sqrt(pow(x2-x1,2)+pow(y2-y1,2));
minus = r2>r1 ? r2-r1 : r1-r2;
plus = r2+r1;
if(d==0 && r1==r2) result = -1; // 완전히 겹칠 때
else if(d==minus || d==plus) result = 1; // 교점 1개
else if(d>minus && d

cout<<result<<'\n';

}

themion   2년 전

중심과 중심 사이의 거리는 정수가 아닐 수도 있습니다. d는 double형으로 선언해야 하고, 한 번만 선언해주세요.

그리고 교점이 2개일 때와 0개일 때의 부분은 복붙 에러인 것 같습니다. 꼼꼼하게 확인해주세요.

0000000000   2년 전

double형으로 선언하면 오차 때문에 매우 위험합니다. sqrt()를 쓰지 않고 제곱만으로 해 보세요.

swo98   2년 전

d를 double로 해주니 해결됐네요

pow가 실수를 반환하는 함수고, 그걸 루트 씌워주는거니까 double형으로 해줘야겠다고 생각했는데 맞았네요

이게 맞는지 확신은 안서지만;;;; 두분모두 감사드립니다

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