반응형
빡세다.. 반례 못찾아서 시간 꽤 썼다..
똑같은 실수를 반복했다.
저번에도 자꾸 틀렸다고 해서 반례 못찾고 낑낑댔다가, float는 부정확하니 double을 사용하시라는 조언을 듣고 자료형을 double로 바꿨을 뿐인데 문제가 풀렸던 기억이 있다. 그리고 설명 꼼꼼히 다 검색해서 개많이 찾아보고, 꼭꼭 알아두자며 블로그에 설명글도 휘황찬란하게 열심히 작성했던 것 같은데......시간노력투자 개많이했는데... 난 또 똑같은 바보짓을 했다.
뭐가틀린거야~하면서 반례 찾다가.. 또다시 float 대신 double을 써보라는 조언을 듣고.. 또다시 double로 바꿔봤더니 문제 풀렸다.. 난 왤케 멍청하지..ㅜ
암기하자. float 대신 double 사용!
www.acmicpc.net/board/view/56027
참고로 나는 카운팅 정렬을 사용해서 문제를 풀었다.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void fsort2(int a[], int n, int min, int max) {
int i;
int *f = calloc(max - min + 1, sizeof(int));
int *b = calloc(n, sizeof(int));
int count=-1;
int index=0;
int chg=1;
for(i = 0; i < n; i++) {
a[i] -= min;
}
for(i = 0; i < n; i++) f[a[i]]++;
for(i = 0 ;i < max - min + 1; i++) {
if(f[i] > count) {
count = f[i];
index = i;
chg=1;
} else if(f[i] == count && chg) {
count = f[i];
index = i;
chg=0; //한번 해주고 나면 이후에 더 큰 값이 두번쨰 오더라도 진행되지 않으므로, 위의if문처럼 새로 큰 값을 찾았을 때 chg=1을 해줘야함.
}
}
for(i = 1; i <= max - min; i++) f[i] += f[i - 1];
for(i = n - 1; i >=0; i--) b[--f[a[i]]] = a[i];
for(i = 0; i < n; i++) {
b[i] += min;
}
//중앙
printf("%d\n", b[(0+n-1)/2]);
//빈도
printf("%d\n", index + min);
//범위
printf("%d\n", b[n-1]-b[0]);
free(b);
free(f);
}
int main() {
int i, nx;
int *x;
int min = 0;
int max = 0;
double a_1=0; // ㅅㅂ.. float 말고 double 넣으니까 해결..
scanf("%d", &nx);
x = calloc(nx, sizeof(int));
scanf("%d", &x[0]);
min = max = a_1 = x[0];
for(i = 1; i < nx; i++) {
scanf("%d", &x[i]);
a_1+=x[i];
if(min > x[i])
min = x[i];
if(max < x[i])
max = x[i];
}
a_1 = round((a_1/nx));
//평균
printf("%.f\n", a_1);
fsort2(x, nx, min, max);
free(x);
return 0;
}
반응형
'[백준]' 카테고리의 다른 글
[BaekJoon/백준] 11650번 & 나중에 다시보기 (0) | 2020.12.01 |
---|---|
[BaekJoon/백준] 1427번 (0) | 2020.11.29 |
[BaekJoon/백준] 10989번 (0) | 2020.11.27 |
[BaekJoon/백준] 2751번 (0) | 2020.11.26 |
[BaekJoon/백준] 2750번 (0) | 2020.10.05 |