~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; }