このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
家族でバーベキューをし、肉は皆に1切れずつということになっていた。肉を食べる前にサッカーをしてバーベキューをする場所に戻ってきたところ、犬が肉を1切れ食べてしまっていた。そこで、長兄は投票をして、1人犬を散歩に連れて遊ばせることにし、その他の人は肉を食べるということにした。家族はn人で0からn-1の添え字で一人一人を表す。voter[]は投票者を表す配列であり、値は家族のメンバーを表す0からn-1の数字が入っている。excluded[]はバーベキューから追い出したい人を表す。こちらも家族のメンバーを表す0からn-1の数字が入っている。
バーベキューからの追い出すルールは、次のルールに従う。
- 最多得票者が追い出される
- 最多得票者数が複数いたら、最多得票者の中で最も多く投票した人が追い出される
- 最多投票者が複数いたら、添え字の小さい方が追い出される
このとき、追い出される人を表す添え字を返すメソッドを作成せよ。
私の解答はこちら。
import java.util.*;
import java.lang.*;
public class Barbecue {
public int eliminate(int n, int[] voter, int[] excluded) {
int[] nVote = new int[n];
int[] nVoted = new int[n];
for( int i=0 ; i<voter.length ; i++ ){
nVote[voter[i]]++;
nVoted[excluded[i]]++;
}
int maxVoted = maxArray(nVoted);
//int maxVoter = maxArray(nVote);
ArrayList<Integer> maxVotedList = new ArrayList();
ArrayList<Integer> maxVoterList = new ArrayList();
for( int i=0 ; i<n ; i++ ){
if( nVoted[i] == maxVoted ){
maxVotedList.add(i);
}
}
System.out.println("-------");
for( int i=0 ; i<n ; i++ ){
System.out.println(nVote[i]);
}
// 最多得票者
if( maxVotedList.size() == 1) return maxVotedList.get(0);
// 得票最多数がタイだった場合
// 該当者の中で投票数が最多だった人が選ばれる
// それでも同じなら先に出てきた人。
Collections.sort(maxVotedList); // ソートしておく
//ArrayList<Integer> maxVoterVotedList = new ArrayList();
int[] candidate = new int[maxVotedList.size()];
int idx = 0;
for( Integer i : maxVotedList ){ // 得票を得た人を対象に出現回数を集計
candidate[idx] = nVote[i.intValue()];
idx++;
}
int maxVoter = maxArray(candidate); // 最多得票数
boolean flg = false;
int res = 0;
for( int i=0 ; i<candidate.length ; i++ ){
if( candidate[i] == maxVoter ){
maxVoterList.add(i); // 一番投票した人一覧作成
if( flg == false ){
flg = true;
res = maxVotedList.get(i);
}
}
}
return res;
}
private int maxArray(int a[]){
int max = -1;
for( int i=0 ; i<a.length ; i++ ){
max = Math.max(max,a[i]);
}
return max;
}
}得点は90/300。結局2時間かけて解きました。正解率は私の予想よりも高く、約72%もあるようです。

0 件のコメント:
コメントを投稿