U E D R , A S I H C RSS

Von Neumann Airport/인수

~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;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:23
Processing time 0.0101 sec