본문 바로가기

C++ in Windows/Challenges

ICPC 대비 문제 3. 여행(The Trip)


문제 3. 여행(The Trip)


PC/UVa ID: 110103/10137, 인기도: B, 성공률: 보통, 레벨: 1


>> 문제


일 년에 한 번씩 다른 여행지로 여행을 가는 학생 모임이 있다. 그 학생들은 지금까지 인디애나폴리

스, 피닉스, 필라델피아, 산호세, 아틀란타를 여행했다. 이번 봄에는 아인트호벤으로 여행을

갈 계획이다.


이 학생들은 여행 경비를 모두 똑같이 부담하기로 합의했지만 돈을 쓸 때마다 나눠서 내는 것은 별로

실용적이지 못하다. 그래서 한명씩 식비, 호텔비, 택시비, 비행기표를 부담하기로 한다. 여행이 끝난

후에 각 학생이 지출한 내역을 계산한 다음 1센트 단위 내에서 모든 학생들이 쓴 돈이 같도록 돈을

주고 받는다. 하지만 이전 여행의 경험에서 비추어보면 돈을 주고 받는 과정은 정말 지루하고 오랜 시간

을 요하는 작업이었다. 지출 내역이 주어졌을 때 모든 학생이 쓴 돈이 (1센트 단위 내에서) 똑같아지기

위해 전달되어야 하는 최소 액수를 구해보자.


>> 입력

표준 입력을 통해 여러 번의 여행에 대한 정보가 입력된다. 각 여행은 여행에 참가한 학생 수를 나타내는

정수 n으로 구성된다. 이 정수 밑이로는 n개의 줄이 입력되는데, 각 줄에는 달러와 센트 단위로 각 학생이

지출한 경비가 입력된다. 학생 수는 1000명을 넘지 않으며 어떤 학생도 $10,000.00 이상 지출하지 않는

다. 마지막 여행에 대한 정보 다음 줄에는 0만 들어있는 줄이 입력된다.


>> 출력

각 여행에 대해 각 학생이 사용한 금액이 똑같아지기 위해 전달되어야 하는 금액의 총합을 출력한다.


>> 입력예

3

10.00

20.00

30.00

4

15.00

15.01

3.00

3.01

0


>> 출력예

$10.00

$11.99



소스 보기
#include <iostream>
#include <iomanip>

using namespace std;

class Calculate
{
public:
	Calculate()
	{

	}
	~Calculate()
	{

	}

private:
	int personNum;
	double* account;

	double totAccount;

	double min;
public:
	void InputPerson(int num)
	{
		this->personNum = num;

		this->account = new double[this->personNum];
	}

	void InputAccount(int num, double account)
	{
		this->account[num] = account;
	}

	void calc(void)
	{
		this->totAccount = 0;
		
		for ( int i = 0; i < this->personNum; i ++)
		{
			this->totAccount += (this->account[i] / this->personNum); 
		}

		this->min = 0;	

		for( int i = 0; i < this->personNum; i++)
		{
			double temp;
	
			temp = this->totAccount - this->account[i];
			
			int temp2 = (int)(temp*100.); //센트 버림
			temp = (double)temp2/100.;
			if ( this->totAccount > this->account[i] ) 
				this->min += temp;
		}
	}

	void print(void)
	{
		cout << ::setiosflags(ios::fixed);
		cout << "$" << setprecision(2) << (this->min)  << "\n"; 
		delete []this->account;
	}
};

void main(void)
{
	while(true)
	{
		int psNum;
		cin >> psNum;

		if( psNum == 0 )
			break;
		if( psNum > 1000)	// 1000 명 예외처리.
			continue;

		Calculate cal;

		cal.InputPerson(psNum);

		for( int i = 0; i < psNum; i++)
		{
			double ac;

			cin >> ac;

			if ( ac > 10000 )	// 10000 달라 예외처리.
				i--;
			else
				cal.InputAccount(i, ac);
		}

		cal.calc();
		cal.print();

	}
}