smilemask92   2년 전

2108문제 ㅠㅠ 통계학문제.. 밥이 안 넘어갑니다. 며칠 째 반례를 못찾겠고. 틀렸습니다로 도배 ㅠㅠ

살려주세요 ㅠㅠㅠ


진짜 -40000~4000까지 온갖 숫자 다 넣어봤어요.

보통 반례가 절대값이 큰 수에서 나오는 경우가 많아서 막 -3999 3456 이런거 다 넣어봐도 다 맞게 나와요.

총 숫자가 1개 들어가는 경우도 했습니다. (이 경우엔, 평균, 최빈값, 중앙값 다 N으로 나오고 range는 0으로 나오는거 맞죠?)

ㅠㅠㅠ 살려주세요...


참고로 Merge소트는 예전에  소트 전용 문제에서 다 맞게 뜬거 복붙했쪄욤.


감사합니다. X100

kks227   2년 전

2000이 500000개 들어오면 평균이 1988로 나옵니다.

sum을 float 형으로 선언하지 마시고, int형으로 선언하신 후 그냥 출력할 때 1.0*sum/N 또는 (float)(sum/N) 등으로 형변환해 주세요.

또, float는 정밀도가 떨어지므로 보다 정밀도가 높은 double을 사용하는 것도 좋습니다. (형식지정자: %lf)

smilemask92   2년 전

댓글 정말 감사합니다~~ ^O^

ㅠㅠ 2000이 500000개 들어올 때 평균이 왜 1988로 나올까요? ㅠㅠ 버그인가요??


printf("%0.lf\n",(double)(sum/N));

printf("%0.f\n",(float)(sum/N))

printf("%0.lf\n",1.0*sum/N);

다 해봐도 ㅠㅠ 한 50% 지났을때 3초 남기고 "틀렸습니다"가 떠요.

kks227   2년 전

sum 타입을 int형으로 선언하셔야만 합니다.

printf 문 안의 형변환을 하기도 전에, 처음에 sum에 값을 더하는 중에 이미 실수오차가 발생한겁니다. 즉, 2000을 50만 번 더하는 중에 실수오차가 왕왕 생긴 것이죠...

들어올 수 있는 값의 범위가 -4000 ~ 4000이고 50만 개의 값이 있으니 절댓값 최대치가 20억인데 이는 int형으로 표현할 수 있습니다. int형을 보존하면서 더해야 합니다.


smilemask92   2년 전

네 ㅠㅠ float sum=0을 int sum=0으로 수정했어요.


그런데 출력할 때.

printf("%0.lf\n",(double)(sum/N));

printf("%0.f\n",(float)(sum/N))

printf("%0.lf\n",1.0*sum/N);

printf("%0.f\n",1.0*sum/N);

다 해봐도...안되네욤 ㅠㅠ


심지어..
int avg선언한 뒤에
(sum>=0)?avg=(double)sum/N+0.5:avg=(double)sum/N-0.5; ....로 하고
printf("%d\n",avg);
라고 해도 안되요 ㅋㅋㅋㅋㅋㅋㅋ

한 3초 남겼을 때 이러니 .... 너무 슬프네요. ㅠㅠㅠㅠ

kks227   2년 전

음 그렇다면 sum 말고 다른 문제도 있나 보네요...

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