DOLLS - RTE 오류가 발생하는데 어떻게 해야 할지 모르겠습니다.

  • yebgi
    yebgi

    RTE (SIGSEGV: segmentation fault, probably incorrect memory access)가 발생하는데 어디가 문제인지 모르겠네요.

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_T 50
    #define MAX_N 100000
    
    struct dolls_item
    {      
        int idx;
        int num;
    };
    
    int n[MAX_T];
    int solve[MAX_T][MAX_N];
    
    int qsort_dolls_item(const void *arg1, const void *arg2)
    {
        return ((struct dolls_item *)arg1)->num >= ((struct dolls_item *)arg2)->num;
    }
    
    void solve_dolls(int *solve, int *dolls, int n, int m)
    {
        int i, j;
    
        struct dolls_item dolls_item[MAX_N];    
    
        for (i = 0; i < n; i++)
        {
            dolls_item[i].idx = i;
            dolls_item[i].num = dolls[i];
        }
    
        qsort(dolls_item, n, sizeof(struct dolls_item), qsort_dolls_item);
    
        for (i = 0; i < n; i++)
        {
            int min = dolls_item[i].num;
    
            if (min * (n - i) <= m)
            {
                for (j = i; j < n; j++)
                {
                    dolls_item[j].num -= min;
                    solve[dolls_item[j].idx] += min;
                    m -= min;
                }
            }
            else
            {
                for (j = i; j < n; j++)
                {
                    dolls_item[j].num -= (m / (n - i));
                    solve[dolls_item[j].idx] += (m / (n - i));
                    m -= (m / (n - i));
                }
    
                for (j = i; j < m; j++)
                {
                    dolls_item[j].num--;
                    solve[dolls_item[j].idx]++;
                    m--;
                }
            }
        }
    }
    
    int main(int argc, char *argv[])
    {
        int T;
        int i, j;
    
        scanf("%d", &T);
    
        for (i = 0; i < T; i++)
        {
            int m;
            int dolls[MAX_N];
    
            scanf("%d %d", &n[i], &m);
    
            for (j = 0; j < n[i]; j++)
                scanf("%d", &dolls[j]);
    
            solve_dolls((int *)&solve[i], (int *)&dolls, n[i], m);
        }
    
        for (i = 0; i < T; i++)
        {
            for (j = 0; j < n[i]; j++)
            {
                if (j + 1 < n[i])
                    printf("%d ", solve[i][j]);
                else
                    printf("%d\n", solve[i][j]);
            }
        }       
    
        return 0;
    }
    

    8년 전
1개의 댓글이 있습니다.
  • Being
    Being

    qsort()의 비교 함수가 잘못된 값을 되돌립니다. 크기에 따라 0보다 크거나 작거나 같은 값을 되돌려야 합니다. 표준을 참고하세요.


    8년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.