import java.util.Arrays;
public class PickTeam
{
int n, bestSum;
int[] team;
int[][] nums;
String[] names, bestTeam;
void recur(int idx, int size) {
if(size == team.length) {
int sum=0;
for(int i=0; i < team.length; i++)
for(int j=i+1; j < team.length; j++)
sum += nums[team[i]][team[j]];
if(sum > bestSum) {
bestSum = sum;
for(int j=0; j < team.length; j++)
bestTeam[j] = names[team[j]];
}
return;
}
for (int i=idx; i < n; i++) {
if(team.length-size+i-1 == n) break;
team[size] = i;
recur(i+1, size+1);
}
}
public String[] pickPeople(int teamSize, String[] people) {
n = people.length;
bestSum = Integer.MIN_VALUE;
team = new int[teamSize];
nums = new int[n][n];
names = new String[n];
bestTeam = new String[teamSize];
for (int i=0; i < n; i++) {
String[] s = people[i].split(" ");
names[i] = s[0];
for(int j=1; j < s.length; j++)
nums[i][j-1] = Integer.parseInt(s[j]);
}
recur(0,0);
Arrays.sort(bestTeam);
return bestTeam;
}
}
Explanation
순서에 상관없이 자신과 상대방에 대한 평가 점수를 더해나가면 된다. 처음에는 team[] 을 recur 함수에 인자로 넣었는데 스택 낭비인 것을 깨닫고 전역 배열로 선언해서 대입하였다.
recur() - > if(team.length-size+i-1 == n) break;
// 선택하려는 인원이 TeamSize 보다 적을 경우 반복문을 탈출한다.
최근 덧글