본문 바로가기
[백준]

[BaekJoon/백준] 2108번

by Hevton 2020. 11. 28.
반응형

빡세다.. 반례 못찾아서 시간 꽤 썼다..

 

똑같은 실수를 반복했다.

 

저번에도 자꾸 틀렸다고 해서 반례 못찾고 낑낑댔다가, 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