- 이제 assert문 쓰는 법을 알아 가고 있다.
 
- 훌륭한 프로그래머들의 습관을 따라 해보려 노력중이다.
 
- 전문 프로그래머들은 assert문을 자주 쓴다고 한다.
 
 
~cpp 
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("milk.in");
ofstream fout("milk.out");
void InputInitData(int& suf, int& numf, map<int,int>& data, vector<int>& numlist);
int Process(int& suf, int& numf, map<int,int>& data, vector<int>& numlist);
void OutputData(int& numf, map<int,int>& data, vector<int>& numlist);
int main()
{
	int numf, suf;
	map<int,int> data;
	vector<int> numlist;
	InputInitData(suf, numf, data, numlist);
	fout << Process(suf, numf, data, numlist) << endl;
	return 0;
}
void InputInitData(int& suf, int& numf, map<int,int>& data, vector<int>& numlist)
{
	fin >> suf;
	fin >> numf;
	int cost, amount;	
	for(int i = 0 ; i < numf ; ++i)
	{
		fin >> cost;
		fin >> amount;
		if(data[cost] == 0)
			numlist.push_back(cost);
		data[cost] += amount;
	}
	sort(numlist.begin(), numlist.end());
}
int Process(int& suf, int& numf, map<int,int>& data, vector<int>& numlist)
{
	int ret = 0;
	int until = 0;
	int whenstop = 0;
	for(int i = 0 ; i < numlist.size() ; ++i)
	{
		if(suf > until + data[numlist[i]])
		{			
			ret += numlist[i] * data[numlist[i]];
			until += data[numlist[i]];
		}
		else
		{
			whenstop = i;
			break;
		}
	}
	if(whenstop <  numlist.size())
		ret += numlist[whenstop] * (suf - until);
	return ret;
}