このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
長方形の集まりが描かれる面は最初は完全に真白である。各長方形は厳密に直前に描いた長方形の内部に収まる。長方形は赤、青、緑の3色のどれかで描かれる。色は混じることがないので、長方形を別の長方形の内部に描いたとき、新しい色がその位置にあった既存の色を置き換えることになる。長方形の集まりはwidth[]とheight[]という整数型の配列とcolorという文字列で表される。i番目に描かれる長方形のサイズはwidth[i]とheight[i]である。そしてその色はcolorのi番目の文字である。文字は"R"、"G"、"B"の3つであり、それぞれ赤、緑、青を表している。すべての長方形が描かれたとき、赤、緑、青が占める面積を計算し、3つの面積の中から最大になるものの値を返せ。
私の解答はこちら。
public class ChainOfRectangles { public int getMaximalArea(int[] width, int[] height, String color) { int r = 0; // 各色ごとに見えている面積を表す変数 int g = 0; int b = 0; char prev = ' '; // 注目している長方形の直前の長方形の色を記録 for( int i=0 ; i<color.length() ; i++ ){ int iArea = width[i]*height[i]; // 注目する色の面積を増やす char col = color.charAt(i); if( col == 'R' ){ r += iArea; }else if( col == 'G' ){ g += iArea; }else{ b += iArea; } switch(prev){ // 直前の色の面積を減らす case 'R': r -= iArea; break; case 'G': g -= iArea; break; case 'B': b -= iArea; break; default: break; } prev = col; } return Math.max(r, Math.max(g, b)); } }
得点は228.08/250、中央値は約197点。1回のsubmitでシステムテストクリア。実装要求の割にちょっと行数がおおいかな?
0 件のコメント:
コメントを投稿