このTopCoderの問題はこちら で見ることができる(要TopCoder登録 & 問題文は英語)。問題文について説明する。
あなたは新しい家を建築中で、ある部屋に床板を敷こうとしている。設計師は床板のレイアウトをデザインしており、それに対し何枚のボードを買う必要があるか知りたいと思っている。各板は1単位の幅を持ち、すべて任意の正の整数の値をとり得る。部屋は長方形の形状をしており、板は壁とは平行に、1単位の正方形の格子の位置に配置するものとする。 layout[]という、床板のレイアウトを表す文字列が与えられる。i番目の文字列のj番目の要素は正方形の格子の(i, j)番目の位置を表しており、その内容は"-"または"|"になる。それらは床板の方向を表している。もし"-"という2文字がi番目の文字列に隣り合っていれば、それは東西方向の床板1枚を表す。同様に"|"については、jが同じで隣り合う配置であれば、南北方向の床板1枚を表すことになる。レイアウト通りに配置するときに必要となる床板の枚数を返せ。
public class FloorLayout {
public int countBoards(String[] layout) {
int nBoard = 0;
nBoard += count(layout, '-');
String[] transpose = new String[layout[0].length()]; // layoutを転置した後の文字列
for( int i=0 ; i<layout[0].length() ; i++ ){
StringBuilder sb = new StringBuilder();
for( int j=0 ; j<layout.length ; j++ ){
sb.append(layout[j].charAt(i));
}
transpose[i] = sb.toString();
sb.delete(0, sb.length());
}
nBoard += count(transpose, '|');
return nBoard;
}
// typeという文字の板が何枚必要になるか、平行方向についてのみカウント
// "-"にはそのまま適用可能、"|"についてはlayoutを転置することで適用可能。
private int count(String[] layout, char type){
int nBoard = 0;
for( int i=0 ; i<layout.length ; i++ ){
char prev = ' ';
for( int j=0 ; j<layout[0].length() ; j++ ){
char c = layout[i].charAt(j);
if( c == type ){
if( prev != type ) nBoard++;
}
prev = c;
}
}
return nBoard;
}
}
得点は181.76/250、1回のsubmitでシステムテストクリア。中央値は約173点。
0 件のコメント:
コメントを投稿