#include <iostream>#include <vector>#include <algorithm>classBook{private:inttestcase;//testcaseintN,M;//N은 책의 수 M은 서점의 수intbookPrice[200][100];intbookPoint[200][100];//각 책의 포인트std::vector<int>resultPrice;//각 서점별 가격저장 public:Book();~Book();voidinput();voidprocess();voidprint();};intmain(){newBook();}Book::Book():N(0),M(0){input();}voidBook::input(){std::cin>>testcase;for(inti=0;i<testcase;i++){std::cin>>N>>M;for(intj=0;j<N;j++){for(intk=0;k<M;k++){std::cin>>bookPrice[j][k];std::cin>>bookPoint[j][k];}}process();//계산과정print();//결과 출력resultPrice.clear();//결과 초기화}}voidBook::process(){intsum;inttemp;// 처음 마일리지를 저장for(intk=0;k<M;k++){sum=0;temp=bookPoint[0][k];for(intj=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());//가장 작은 수를 찾기 위해 소팅}voidBook::print(){std::cout<<resultPrice[0]<<std::endl;//처음 수가 가장 작은 수이다.}
책이 두 권 있다고 치고, 두 권 모두 1000원인데 마일리지를 3000점 적립해준다고 칩시다. 그러면 위의 코드의 경우 -2000원을 두 번 더하고 -2000원을 빼니 -2000원에 구매 가능하다고 하겠지만, 실제로는 마일리지 사용량에 한도가 있으므로 단순히 가격을 빼는 것으로는 해결할 수 없습니다.
@Being 모든 책의 가격은 10,000 이하의 자연수이며, 적립 포인트는 책의 가격보다 작은 음이 아닌 정수이다. 라고 문제에 명시되어 있긴 해요...
@wndusgh21 일단 resultPrice.push_back(sum+temp); 문장이 해당 루프보다 한 단계 밖 루프로 위치가 바뀌어야 할 것 같습니다
wndusgh21
이 문제에 나와 있는 예나 제가 만든 예는 다 잘 나옵니다.
하지만 저지머신에 올리면 오답이라고 나오네요......
제가 기본적인 먼가를 놓친 것인지 아닌지 계속 생각해 봐도 답이
나오지 않아서 올려봅니다. 코드를 보시고 초보의 눈을 뜨게 해주세요.
간단히 설명드리자면
책 가격과 마일리지 가격을 순차적으로 빼고 마지막에 마일리지 값중
가장 작은 값을 더하는 식으로 프로그램이 돌아갑니다.
그리고 resultPrice를 소팅하여서 0번 배열을 출력합니다.
결과적으로 가장 작은 값을 출력하게 됩니다.
이 과정을 testcase 만큼 반복합니다..........
12년 전