흠..이번엔 빨리 끝냈다. 그나마 쉬운 문제였던가...ㅠㅠ
/*
Subject: #119 Greedy Gift Givers
e-mail: morcavon@gmail.com
Homepage: http://morcavon.byus.net
Building: 28/01/2005 ~ 29/01/2005
Last Update: 29/01/2005
*/
/*
<INPUT>
nPeople nPeople: # of people in the group
name[] name[]: a list of the names of each person in the group
name money n whom name: name of the person / money: the amount of money spent of gifts /
n: number of people to whom gifts are given /
whom: names of those to whom gifts are given.
.
.
.
-
<OUTPUT>
name net_worth
-blank line-
...
-
<CONDITOIN>
nPeople >= 10
max length of each name is 12 characters.
0 < money <= 2000
*/
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
typedef struct _person* pPerson;
typedef struct _person
{
short money; // net worth
char name[13]; // one's name
pPerson link; // link to next node
pPerson next; // link to next person(order by)
} person;
pPerson get_person(pPerson array[], char *name);
pPerson save_person(pPerson array[], char *name);
void init_array(pPerson array[]);
void main()
{
pPerson friends[26] = {0}; // 알파벳 수 만큼 선언..
pPerson w_ptr, startPtr;
short nPerson, money, gift, n, i;
char name[13];
cin >> nPerson;
while (1) {
init_array(friends);
//////////////////////////////////////////////////////////////////////////
/////////////////////////// INPUT PART ///////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 일단 한명의 이름을 받아서 시작점을 잡는다.
cin >> name;
startPtr = w_ptr = save_person(friends, name);
for (i = 1; i < nPerson; i++) {
cin >> name;
w_ptr->next = save_person(friends, name);
w_ptr = w_ptr->next;
}
w_ptr->next = NULL;
//////////////////////////////////////////////////////////////////////////
/////////////////////////// PROCESSING //////////////////////////////
//////////////////////////////////////////////////////////////////////////
for (i = 0; i < nPerson; i++) {
cin >> name >> money >> n;
// n명의 사람들에게 줄 선물(금액)
if (money == 0 || n == 0)
gift = 0;
else
gift = money / n;
get_person(friends, name)->money -= gift * n; // 선물로 준 금액 만큼 뺌
while (n-- > 0) {
cin >> name;
get_person(friends, name)->money += gift;
}
} // end of one processing
//////////////////////////////////////////////////////////////////////////
/////////////////////////// OUTPUT PART //////////////////////////////
//////////////////////////////////////////////////////////////////////////
for (w_ptr = startPtr; w_ptr != NULL; w_ptr = w_ptr->next) {
cout << w_ptr->name << " " << w_ptr->money << endl;
}
cin >> nPerson;
if (cin.eof())
break;
else
cout << "\n";
} // end of one group
}
pPerson get_person(pPerson array[], char *name)
{
/*
array에서 name이라는 이름을 갖는 노드를 찾아 반환.
name의 첫문자를 배열의 인덱스로 접근해서,
해당 원소에 name이 없다면 link를 따라가면서 name을 찾는다.
*/
pPerson w_ptr = array[name[0] - 'a'];
while (strcmp(name, w_ptr->name) != 0)
w_ptr = w_ptr->link;
return w_ptr;
}
pPerson save_person(pPerson array[], char *name)
{
/*
array[]에 해당 정보를 갖는 person노드를 저장한다.
name[0]을 인덱스로 사용하고,
이미 배열에 노드가 들어가 있으면 그 노드에 연결된 리스트의 마지막에 추가한다.
*/
pPerson new_face = (pPerson)malloc(sizeof(person));
pPerson w_ptr = array[name[0] - 'a'];
strcpy(new_face->name, name);
new_face->money = 0;
new_face->link = NULL;
if (w_ptr == NULL) // 헤드에 연결
array[name[0] - 'a'] = new_face;
else {
// 저장할 위치 찾기
while (w_ptr->link != NULL)
w_ptr = w_ptr->link;
w_ptr->link = new_face;
}
return new_face;
}
void init_array(pPerson array[])
{
// 배열을 초기화 한다.
for (char i = 0; i < 26; i++) {
if (array[i] != NULL) {
free(array[i]);
array[i] = NULL;
}
}
}