No older revisions available
No older revisions available
~cpp
// 코드 깔끔히 하는 법이랑 디자인 방법 같은걸 나름대로 생각해보는 연습으로..
// 접하는 문제를 모두 OOP적으로 풀어보려 노력하려한다.
// 근데 잘 안된다 --; 열심히 하다 보면 되겠지
// 끝부분에 소트시키는 부분이 있는데.. 귀찮아서 그냥 map에 때려넣었다. map<int,int> 해서 키값은 traffic양, 값은 테스트번호, 이런식으로 하면 지가 알아서 정렬한다.
// 뭔가 좀 이상하긴 하지만--;
//Traffic은 거의 데이타 저장고(data holder)의 역할을 하고 있네요. C의 struct처럼 말이죠.
//만약 지능(intelligence)를 좀 더 분배하거나, 책임(responsibility)을 더 줄 수 없다면
//제거해 버리는 것이 좋지 않을까 합니다. --JuNe
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
class Traffic;
class Airport;
class Admin;
class Traffic
{
private :
int _departureGateNum;
int _arrivalGateNum;
int _passengerNum;
public :
Traffic(int departureGateNum, int arrivalGateNum, int passengerNum)
: _departureGateNum(departureGateNum), _arrivalGateNum(arrivalGateNum), _passengerNum(passengerNum) {}
int getPassengerNum() const
{
return _passengerNum;
}
int getDepartureGateNum() const
{
return _departureGateNum;
}
int getArrivalGateNum() const
{
return _arrivalGateNum;
}
};
class Airport
{
private:
enum { DISTANCE = 1 };
vector<Traffic> _traffics;
vector<int> _arrivalGateNums;
vector<int> _departureGateNums;
int _totalTraffic;
int _numCity;
public :
Airport(int numCity) : _numCity(numCity)
{
_arrivalGateNums.resize(_numCity);
_departureGateNums.resize(_numCity);
}
void addTrafficData(const Traffic& traffic)
{
_traffics.push_back(traffic);
}
int getTrafficAmount(const Traffic& traffic) const
{
return traffic.getPassengerNum();
}
void eraseGateOrder()
{
_arrivalGateNums.clear();
_departureGateNums.clear();
}
int getDistance(const Traffic& traffic) const
{
int ar, dp;
for(int i = 0 ; i < _departureGateNums.size(); ++i)
{
if( _departureGateNums[i] == traffic.getDepartureGateNum() )
{
dp = i;
for(int j = 0 ; j < _arrivalGateNums.size(); ++j)
{
if( _arrivalGateNums[j] == traffic.getArrivalGateNum() )
{
ar = j;
break;
}
}
break;
}
}
return DISTANCE + abs(ar-dp) * DISTANCE;
}
int getTotalTraffic()
{
int total = 0;
for(int i = 0 ; i < _traffics.size() ; ++i)
total += getDistance(_traffics[i]) * getTrafficAmount(_traffics[i]);
_totalTraffic = total;
return _totalTraffic;
}
void addArrivalGate(int num)
{
_arrivalGateNums.push_back(num);
}
void addDepartureGate(int num)
{
_departureGateNums.push_back(num);
}
};
class Admin
{
private :
map<int, int> _trafficAmountCollection;
public :
Admin()
{
runProcess();
}
void runProcess()
{
ifstream fin("airport.in");
while(1)
{
int numCity;
fin >> numCity;
if(!numCity)
break;
Airport airport(numCity);
int departureNum, iterateNum, arrivalNum, trafficAmount;
for(int i = 0 ; i < numCity ; ++i)
{
fin >> departureNum;
fin >> iterateNum;
for(int j = 0 ; j < iterateNum ; ++j)
{
fin >> arrivalNum;
fin >> trafficAmount;
Traffic traffic(arrivalNum, departureNum, trafficAmount);
airport.addTrafficData(traffic);
}
}
int testCaseNum, gateNum, testCount = 0;
cout << "ConfigurationtLoad" << endl;
while(1)
{
fin >> testCaseNum;
if(!testCaseNum)
break;
for(int i = 0 ; i < numCity ; ++i)
{
fin >> gateNum;
airport.addArrivalGate(gateNum);
}
for(int i = 0 ; i < numCity ; ++i)
{
fin >> gateNum;
airport.addDepartureGate(gateNum);
}
_trafficAmountCollection[airport.getTotalTraffic()] = testCaseNum;
++testCount;
airport.eraseGateOrder();
}
showTrafficAmount();
}
}
void showTrafficAmount()
{
for(map<int, int>::iterator j = _trafficAmountCollection.begin() ; j != _trafficAmountCollection.end() ; ++j)
{
cout << "t" << j->second << "t" << j->first << endl;
}
_trafficAmountCollection.clear();
}
};
int main()
{
Admin gogo;
return 0;
}