このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題についておおまかに説明する。
チェスの大会で、全員が一度ずつペアになって対戦する。試合の結果は3つの中のどれかになる。プレーヤ1の勝利、プレーヤ2の勝利、引き分けである。トーナメントのあいまいさを表す数字は3すくみの関係が成立する3人のペアの数になる。つまり、aはbに勝利し、bはcに勝利し、cはaに勝利するということである。table[]という試合結果が入った文字列型配列が渡される。table[i]のj番目の要素について、iがjに勝てば"1"、負ければ"0"、引き分けなら"-"が含まれることになる。与えられたトーナメントのあいまいさを表す数字を返せ。
私の解答はこちら。
public class TournamentsAmbiguityNumber { public int scrutinizeTable(String[] table) { int nAmbiguity = 0; int nMember = table[0].length(); for( int i=0 ; i<nMember ; i++ ){ for( int j=0 ; j<nMember ; j++ ){ for( int k=0 ; k<nMember ; k++ ){ if( i==j || j==k || k==i ) continue; // 3人の関係を見ていない場合 char a = table[i].charAt(j); char b = table[j].charAt(k); char c = table[k].charAt(i); // よくよく考えてみると a == '1' && b == '1' && c == '1' // とすればよいだけだった。そうすればreturn文で2で割ることも不要になる。 if( a == '-' || b == '-' || c == '-' ) continue; if( a == b && b == c ){ nAmbiguity++; } } } } return nAmbiguity/2; // 全部0,0,0と1,1,1の場合がカウントされているので2で割る } }
得点は227.60/250、1回のsumbitでシステムテストクリア。無駄にコードが増えてますな。
0 件のコメント:
コメントを投稿