BOOKSTORE 문제.....

  • wndusgh21
    wndusgh21

    이 문제에 나와 있는 예나 제가 만든 예는 다 잘 나옵니다.

    하지만 저지머신에 올리면 오답이라고 나오네요......

    제가 기본적인 먼가를 놓친 것인지 아닌지 계속 생각해 봐도 답이

    나오지 않아서 올려봅니다. 코드를 보시고 초보의 눈을 뜨게 해주세요.

    간단히 설명드리자면

    책 가격과 마일리지 가격을 순차적으로 빼고 마지막에 마일리지 값중

    가장 작은 값을 더하는 식으로 프로그램이 돌아갑니다.

    그리고 resultPrice를 소팅하여서 0번 배열을 출력합니다.

    결과적으로 가장 작은 값을 출력하게 됩니다.

    이 과정을 testcase 만큼 반복합니다..........

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    class Book{
    
    private:
        int testcase;//testcase
        int N,M;     //N은 책의 수 M은 서점의 수
        int bookPrice[200][100]; 
        int bookPoint[200][100];   //각 책의 포인트
        std::vector<int> resultPrice;  //각 서점별 가격저장 
    
    public:
        Book();
        ~Book();
        void input();
        void process();
        void print();
    
    };
    
    int main()
    {
        new Book();
    }
    
    
    Book::Book()
        :N(0),M(0)
    {
        input();
    }
    void Book::input()
    {
        std::cin>>testcase;
    
        for(int i=0; i<testcase; i++){
            std::cin>>N>>M;
    
            for(int j=0; j<N; j++){
                for(int k=0; k<M; k++){
                    std::cin>>bookPrice[j][k];
                    std::cin>>bookPoint[j][k];
                }
            }
            process();          //계산과정
            print();//결과 출력
            resultPrice.clear();//결과 초기화
        }
    
    }
    
    void Book::process()
    {
        int sum;
        int temp;// 처음 마일리지를 저장
    
        for(int k=0; k<M; k++){
            sum=0;
            temp=bookPoint[0][k];
    
            for(int j=0; j<N; j++){
                sum += bookPrice[j][k]-bookPoint[j][k];
    
                if(bookPoint[j][k]<temp)//가장 작은 마일리지 값 구함
                    temp=bookPoint[j][k];
                }
                resultPrice.push_back(sum+temp);
            }
    
    
    
        std::sort(resultPrice.begin(),resultPrice.end()); //가장 작은 수를 찾기 위해 소팅
    
    }
    
    void Book::print(){
    
            std::cout<<resultPrice[0]<<std::endl; //처음 수가 가장 작은 수이다.
    
    }
    

    11년 전
13개의 댓글이 있습니다.
  • kcm1700
    kcm1700

    코드 보기가 어려워서 코드에 마크업 추가했습니다.


    11년 전 link
  • wndusgh21
    wndusgh21

    수정해 주셔서 감사합니다.

    저런 형식으로 글을 올리려면 어떻게 하여야 하는지 알려주시면

    다음에 참고 하겠습니다.


    11년 전 link
  • Being
    Being

    책이 두 권 있다고 치고, 두 권 모두 1000원인데 마일리지를 3000점 적립해준다고 칩시다. 그러면 위의 코드의 경우 -2000원을 두 번 더하고 -2000원을 빼니 -2000원에 구매 가능하다고 하겠지만, 실제로는 마일리지 사용량에 한도가 있으므로 단순히 가격을 빼는 것으로는 해결할 수 없습니다.


    11년 전 link
  • Being
    Being

    글 쓰실 때 아래쪽에 보면 문법 안내문이 있습니다. 참고해 주세요.


    11년 전 link
  • VOCList
    VOCList

    @Being 모든 책의 가격은 10,000 이하의 자연수이며, 적립 포인트는 책의 가격보다 작은 음이 아닌 정수이다. 라고 문제에 명시되어 있긴 해요...
    @wndusgh21 일단 resultPrice.push_back(sum+temp); 문장이 해당 루프보다 한 단계 밖 루프로 위치가 바뀌어야 할 것 같습니다


    11년 전 link
  • VOCList
    VOCList

    @Being 는 상관없구나 ㅈㅅㅈㅅ 헤헤


    11년 전 link
  • VOCList
    VOCList

    @wndusgh21 헐 인덴트에 낚였네여 저기가 맞군...
    ......ㅠㅠ 자살


    11년 전 link
  • wndusgh21
    wndusgh21

    먼저 관심가져주셔서 갑사합니다.^
    말씀해 주신 것은
    resultPrice.push_back(sum+temp); 을 한 단계 빼버리면
    결론적으로 마지막 서점의 값만 저장이 됩니다.
    그래서 정상적인 답이 나오지 않네요...


    11년 전 link
  • Being
    Being

    @VOCList 아 그런 조건이 있었네요. 뭐 그렇다 하더라도, 3000/3000짜리 책과 1000/1000짜리 책이 있었다고 칩시다. 이 경우 최대 할인폭은 어떻게 하더라도 1000원이지만, 위 솔루션으로는 그런 답이 나오지 않겠네요.


    11년 전 link
  • wndusgh21
    wndusgh21

    ㅠ.ㅠ 머신이 오답이라고 나오는 문제가 많아서 제가 기본적인 조건들을 무시하고 지나간 것은 없는지 고수분들의 의견을 들어 보고 싶어서 올려보았습니다.


    11년 전 link
  • wndusgh21
    wndusgh21

    @Being 제 경우는 3000/3000 1000/1000 이면 결과 값이 1000원이 나옵니다. 1000원짜리 책을 먼저 샀을 경우 3000원 책의 마일리지는 적용되지 않으니 답은 3000원이 나옵니다.


    11년 전 link
  • VOCList
    VOCList

    @wndusgh21 3000/3000 1000/1000 의 경우 답은 3000이 나와야 합니다.


    11년 전 link
  • wndusgh21
    wndusgh21

    @VOCList 무엇이 잘못되었는지 알겠습니다.
    곧 수정해 볼게요. 감사합니다.


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