ikemonn's blog

技術ネタをちょこちょこと

【TopCoder】SRM 161 DIV2 Lv.1

SRM 161 DIV2 Lv.1

問題文概略

カードを決められた人数に配るとき、それぞれの人の手持ちカードを求める

書いたコード

import java.util.Arrays;

public class CardCount {

    public String[] dealHands(int numPlayers, String deck) {

        String[] ans = new String [numPlayers];
        Arrays.fill(ans, "");

        if(deck.length() < numPlayers) {
            return ans;
        }
        for(int j = 0; j < deck.length(); j++) {
            ans[j%numPlayers] += deck.charAt(j);
        }

        return ans;
    }

}

他の参加者のコードを読んで修正した

import java.util.Arrays;

public class CardCount {

    public String[] dealHands(int numPlayers, String deck) {

        String[] ans = new String [numPlayers];
        //初期値を空文字にする
        Arrays.fill(ans, "");
        //1人に配られるカードの枚数回だけ繰り返す(全員が1枚以上カードを貰えない時はfor文は回らない)
        for(int i = 0; i<deck.length() / numPlayers; i++) {
            //j人目がi番目に配られるカードを出す
            for(int j = 0; j<numPlayers; j++) {
                ans[j] += deck.charAt(i * numPlayers + j);
            }
        }
        return ans;
    }

}

雑感

String型の配列を作るとそれぞれの要素のデフォルト値がnullになるのか。 配列の初期値を決める時は、

Arrays.fill(a, "初期値");

とすれば良い。

自分のコードでは、deckがplayerNumよりも小さい時だけ例外処理をしたのだが、 他の参加者のコードを読むと上記の条件の例外処理を書かなくても良い方法で解いていた。 なるほど。