소ê°� ¶
- algorithm ��브러리 너무 좋�..ㅋㅋㅋ
- 한가지� 예외를 �� 못해 조금 헤맸�~
- 한가지� 예외를 �� 못해 조금 헤맸�~
ìƒ�ê°� ¶
- 가장 많� 사람� 있는 팀부터 가장 많� �리가 있는 테�블부터 한명씩 배치시키면 �다.
- ê·¸ë ‡ê²Œ 배치 시키다가 ìž�리가 남지 않아 ë°°ì¹˜í• ìˆ˜ 없는 순간ì�´ 오면 ê·¸ 배치 ë¿�ë§Œ 아니ë�¼ 다른 ì–´ë–¤ 방법으로ë�„ 배치가 불가능하다.
- 어� 한팀� ��� 테�블� 수보다 많아버리면 무조건 배치가 불가능해진다.
- ê·¸ë ‡ê²Œ 배치 시키다가 ìž�리가 남지 않아 ë°°ì¹˜í• ìˆ˜ 없는 순간ì�´ 오면 ê·¸ 배치 ë¿�ë§Œ 아니ë�¼ 다른 ì–´ë–¤ 방법으로ë�„ 배치가 불가능하다.
- 어� 한팀� ��� 테�블� 수보다 많아버리면 무조건 배치가 불가능해진다.
코딩 방법 ¶
- 팀ì�˜ ì�´ë¦„표를 ë¶™ì�´ê³ ê·¸ ìƒ�태ì—�서 ì�¸ì›�ì�´ ë§Žì�€ 순으로 ì •ë ¬
- í…Œì�´ë¸”ì�˜ ì�´ë¦„표를 ë¶™ì�´ê³ ê·¸ ìƒ�태ì—�서 ìž�리가 ë§Žì�€ 순으로 ì •ë ¬
- ì�¸ì›�ì�´ ë§Žì�€ 팀부터 ìž�리가 ë§Žì�€ í…Œì�´ë¸”ì—� 앉히면서 í…Œì�´ë¸”ì—� 앉ì�„ 수 있는 ìž�리수를 ê°�소 ì‹œí‚¤ê³ íŒ€ì�˜ 사람ì—�게 í…Œì�´ë¸” 번호를 부여
- ì�´ë ‡ê²Œ ë�˜ë©´ ìž�리가 ë§Žì�€ í…Œì�´ë¸”ì�´ ë¨¼ì € 앉ì�„ 수 있는 ìž�리가 0ì�¼ ë� 수는 없게ë�œë‹¤.
- 앉히다가 테�블� 앉� 수 있는 �리� 수가 0� 테�블� 만나면 return false.
- 0ì�„ 만나지 ì•Šê³ ë‹¤ ë°°ì¹˜ì‹œí‚¤ê³ ë‚˜ë©´ '1'ì�„ ì¶œë ¥í•˜ê³ ì‚¬ëžŒì—�게 메겨진 í…Œì�´ë¸” 번호ì�˜ ìž‘ì�€ 순으로 ì •ë ¬ 후 ì¶œë ¥
- 0ì�„ 만나게 ë�˜ë©´ '0'ì�„ ì¶œë ¥
- í…Œì�´ë¸”ì�˜ ì�´ë¦„표를 ë¶™ì�´ê³ ê·¸ ìƒ�태ì—�서 ìž�리가 ë§Žì�€ 순으로 ì •ë ¬
- ì�¸ì›�ì�´ ë§Žì�€ 팀부터 ìž�리가 ë§Žì�€ í…Œì�´ë¸”ì—� 앉히면서 í…Œì�´ë¸”ì—� 앉ì�„ 수 있는 ìž�리수를 ê°�소 ì‹œí‚¤ê³ íŒ€ì�˜ 사람ì—�게 í…Œì�´ë¸” 번호를 부여
- ì�´ë ‡ê²Œ ë�˜ë©´ ìž�리가 ë§Žì�€ í…Œì�´ë¸”ì�´ ë¨¼ì € 앉ì�„ 수 있는 ìž�리가 0ì�¼ ë� 수는 없게ë�œë‹¤.
- 앉히다가 테�블� 앉� 수 있는 �리� 수가 0� 테�블� 만나면 return false.
- 0ì�„ 만나지 ì•Šê³ ë‹¤ ë°°ì¹˜ì‹œí‚¤ê³ ë‚˜ë©´ '1'ì�„ ì¶œë ¥í•˜ê³ ì‚¬ëžŒì—�게 메겨진 í…Œì�´ë¸” 번호ì�˜ ìž‘ì�€ 순으로 ì •ë ¬ 후 ì¶œë ¥
- 0ì�„ 만나게 ë�˜ë©´ '0'ì�„ ì¶œë ¥
소스 ¶
#include <iostream>
#include <algorithm>
using namespace std;
int input1, input2;
int i, j;
struct Team {
int number;
int memberNum;
int person[101];
};
struct Table {
int number;
int chairNum;
int chair[101];
};
Team team[71];
Table nTable[51];
bool compareTeam(const Team &a, const Team &b)
{
return a.memberNum>b.memberNum;
}
bool compareTeam2(const Team &a, const Team &b)
{
return a.number<b.number;
}
bool compareTable(const Table &a, const Table &b)
{
return a.chairNum>b.chairNum;
}
void printTeam()
{
cout << "1" <<endl;
for(i=1; i<input1+1; i++)
{
for(j=1; j<team[i].memberNum+1; j++)
cout << team[i].person[j] << " ";
cout <<endl;
}
}
bool matchingTable()
{
for(i=1; i<input1+1; i++)
{
for(j=1; j<team[i].memberNum+1; j++)
{
if(team[i].memberNum>input2)
return false;
if(nTable[j].chairNum>0)
{
nTable[j].chairNum--;
team[i].person[j] = nTable[j].number;
}
else
return false;
}
sort(&team[i].person[1], &team[i].person[team[i].memberNum+1]);
}
return true;
}
int main()
{
while(cin >> input1 >> input2)
{
if(input1==0 && input2==0)
break;
for(i=1; i<input1+1; i++)
{
cin >> team[i].memberNum;
team[i].number=i;
}
for(i=1; i<input2+1; i++)
{
cin >> nTable[i].chairNum;
nTable[i].number=i;
}
sort(&team[1], &team[input1+1], compareTeam);
sort(&nTable[1], &nTable[input2+1], compareTable);
if(matchingTable())
{
sort(&team[1], &team[input1+1], compareTeam2);
printTeam();
}
else
cout << "0" <<endl;
}
return 0;
}










