BOOKSTORE C언어로 푼거 질문임다. 돠주십쇼. 멘붕임다

  • biosvos
    biosvos
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _Book{
        int price;
        int point;
    }Book;
    // 북을 생성합니다. 문제에 보면 책목록을 위한 n과 서점의 갯수를 위한 M이 있는데, 그대로 쓴것입니다.
    // 생성을 위한 동적할당 부분.
    Book **createBook(int M, int N)
    {
        Book **pNew = NULL;
        int i =0;
    
        pNew = (Book **)malloc(sizeof(Book *)*M);
        if(pNew == NULL)
        {
            return NULL;
        }
        pNew[0] = (Book *)malloc(sizeof(Book)*M*N);
        if(pNew[0] == NULL)
        {
            free(pNew);
            return NULL;
        }
    
        for(i=1; i<M; ++i)
        {
            pNew[i] = pNew[i-1] + N;
        }
    
        return pNew;
    }
    
    // 동적할당 해제
    void deleteBook(Book **pMat)
    {
        free(pMat[0]);
        free(pMat);
    }
    
    // book의 정보를 set합니다.
    // 문제에 보면 입력이 책마다로 되어있어 이용하기 힘들다 생각하여, 행과 열을 바꿔서 서점마다로 바깟습니다.
    void setBook(Book **pMat, int M, int N)
    {
        int i =0, j=0;
    
        for(i=0; i<N; ++i)
        {
            for(j=0; j<M; ++j)
            {
                scanf("%d %d",&pMat[j][i].price, &pMat[j][i].point);
            }
        }
    }
    
    // 그저 출력
    void printBook(Book **pMat, int M, int N)
    {
        int i =0, j=0;
    
        for(i=0; i<M; ++i)
        {
            for(j=0; j<N; ++j)
            {
                printf("%d %d",pMat[i][j].price, pMat[i][j].point);
            }
        }
    }
    
    //나눠서 정복하라는 명언을 토대로 나눈것인데,
    // 위에 보시면 제가 행열을 바꿔서 저장했으니,
    // 아래와 같이 포인터로 받을 수 있습니다.
    // N은 책의 수이고요.
    int minPrice(Book *pArr, int N)
    {
        int ret = 0; // 결과 반환을 위해
        int minPoint =pArr[0].point; // 포인트값의 최소찾기.
        int i = 0;
    
        for(i=0;i<N; ++i)
        {
            ret += pArr[i].price - pArr[i].point;
            // 책을 구입할때, 포인터를 빼서 구입합니다.
            // 하지만 나머지 포인트는 버려야 하기 때문에
            // 아래에서 처럼 가장 작은 포인트를 버리기 위해 더하는 것입니다.
            if(pArr[i].point < minPoint)
            {
                minPoint = pArr[i].point;
            }
        }
    
        ret += minPoint;
    
        return ret;
    }
    
    int main()
    {
        int C =0, N=0, M=0;
        int i =0;
        int tmp =0;
        int j =0;
        int *min = NULL;
        Book **pNew = NULL;
    
        scanf("%d", &C);
    
        min = (int *)malloc(sizeof(int)*C);
    
        for(j=0; j<C; ++j)
        {
            scanf("%d %d",&N, &M);
    
            pNew = createBook(M,N);
            setBook(pNew, M, N);
            min[j] = minPrice(pNew[0], N);
            for(i=0; i<M; ++i)
            {
                tmp = minPrice(pNew[i], N);
                if(min[j] > tmp)
                {
                    min[j] = tmp;
                }
    
    
            }
            deleteBook(pNew);
        }
    
        for(i=0; i<C; ++i)
        {
            printf("%d\n",min[i]);
        }
    
        free(min);
    
        return 0;
    }
    

    11년 전
1개의 댓글이 있습니다.
  • JongMan
    JongMan
    1. 질문글은 하나만 올려주시기 바랍니다.
    2. 소스코드를 올리실때는 도움말을 참조해 구문강조가 들어가도록 해주세요.
    3. 소스코드만 올리시는 대신에 알고리즘을 설명해 주시면 더 성실한 답을 받으실 수 있습니다.

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