#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; //처음 수가 가장 작은 수이다.
}
책이 두 권 있다고 치고, 두 권 모두 1000원인데 마일리지를 3000점 적립해준다고 칩시다. 그러면 위의 코드의 경우 -2000원을 두 번 더하고 -2000원을 빼니 -2000원에 구매 가능하다고 하겠지만, 실제로는 마일리지 사용량에 한도가 있으므로 단순히 가격을 빼는 것으로는 해결할 수 없습니다.
@Being 모든 책의 가격은 10,000 이하의 자연수이며, 적립 포인트는 책의 가격보다 작은 음이 아닌 정수이다. 라고 문제에 명시되어 있긴 해요...
@wndusgh21 일단 resultPrice.push_back(sum+temp); 문장이 해당 루프보다 한 단계 밖 루프로 위치가 바뀌어야 할 것 같습니다
wndusgh21
이 문제에 나와 있는 예나 제가 만든 예는 다 잘 나옵니다.
하지만 저지머신에 올리면 오답이라고 나오네요......
제가 기본적인 먼가를 놓친 것인지 아닌지 계속 생각해 봐도 답이
나오지 않아서 올려봅니다. 코드를 보시고 초보의 눈을 뜨게 해주세요.
간단히 설명드리자면
책 가격과 마일리지 가격을 순차적으로 빼고 마지막에 마일리지 값중
가장 작은 값을 더하는 식으로 프로그램이 돌아갑니다.
그리고 resultPrice를 소팅하여서 0번 배열을 출력합니다.
결과적으로 가장 작은 값을 출력하게 됩니다.
이 과정을 testcase 만큼 반복합니다..........
14년 전