SRM member pilot2 DIV2
topcoder2回目。
300点問題をsubmitした時点で残り時間が5分しかなかった。時間かかりすぎ……。
116.71ptもらって、600点問題を開いて終了。
300点問題
import java.util.*; public class Xosceles{ public String[] draw(int xCount){ String[] result; ArrayList<Integer> al = new ArrayList<Integer>(); int t=2; for(int i=4; t<2550;i+=2){ t += i; al.add(t); } for(int i=2; i<51;i++ ){ if(i*i==xCount){ result = new String[i]; int end = ((int)Math.sqrt(xCount))-1; for(int j=0;j<result.length ;j++){ StringBuffer sb = new StringBuffer(50); for(int k=0;k<end;k++){ sb.append("."); } for(int k=0;k<j*2+1;k++){ sb.append("X"); } for(int k=0;k<end;k++){ sb.append("."); } result[j]=sb.toString(); end--; } return result; } } if(al.contains(xCount)){ int elnum = al.indexOf(xCount)+2; result = new String[elnum]; for(int i=0; i<result.length; i++){ StringBuffer sb = new StringBuffer(50); for(int j=0; j<elnum-1; j++){ sb.append("."); } for(int j=0; j<(i+1)*2; j++){ sb.append("X"); } for(int j=0; j<elnum-1; j++){ sb.append("."); } result[i] = sb.toString(); elnum--; } return result; } return new String[0]; } }
xCountがn^2になってる場合はすぐ分かったけど、階差数列になってる場合の判定がよく分からなかったので、Listに数列全部ぶちこんでcontainsで判断。なんてむりやりなんだ。
いつ撃墜されるかびくびくしてたけど、撃墜はされなかった。
チャレンジフェーズが終わった頃、同室の人に「君のコード、2でtestしたときおかしいよ」と指摘された。英語で。英語怖い。
えっと思ってテストしてみると、1のとき{X}、2のとき{XX}と表示されず空白が返っていた。3〜2550を入れたときのことしか考えてなかった……。
SystemTestは無事通ったけどエレガントなコードにはほど遠い。もっとがんばるぞ。
反省
- わざわざStringBuffer使わなくてもStringに+=使えばおkだった
- 数学勉強しろ
- 英語勉強しろ