【Java】じゃんけんの手の出し方 (paizaランク A 相当)


paizaって?

paiza公式サイト
なんかプログラムを書いて、それにランク付けて評価してくれるところ
求人中の企業に対して自分のプログラミング能力をアピールできる
(実務的とは思えないがちゃんと解ければ最低限の能力があると見れるだろう)

今回解く問題

問題:じゃんけんの手の出し方
・総勝負数N
・総指数M
・相手のハンド列S
の3つが入力として与えられ、総勝負数および総指数をきっちり使った時の相手ハンドに対する最大勝利数を割り出す問題
細かくはリンク先

解答コードと結果

import java.util.ArrayList;
import java.util.Scanner;

/**
 * じゃんけんの手の出し方 (paizaランク A 相当)
 */
public class AS001{

    public static void main(String[] args) {

        //入力
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        char[] handArray = sc.next().toCharArray();


        //相手ハンド分析
        int[] handCount = new int[3]; //{G, C, P}
        for(char hand : handArray) {
            switch(hand) {
            case 'G':
                handCount[0]++;
                break;
            case 'C':
                handCount[1]++;
                break;
            case 'P':
                handCount[2]++;
                break;
            }//switch
        }//for


        //ハンドパターン列挙
        ArrayList<Integer[]> patternList = new ArrayList<>(100);
        for(int i = 0; i <= n; i++) {
            for(int j = 0; j <= n; j++) {
                int yubi = i * 2 + j * 5; //指数
                int remain = n - i - j; //残勝負数

                if(yubi == m && remain >= 0) {
                    //総勝負数内に指を使い切る組み合わせ
                    Integer[] pattern = {remain, i, j}; //{g, c, p}
                    patternList.add(pattern);
                }else if(yubi > m || remain < 0) {
                    //勝負数を使い切るか、指数がオーバーしたら次のループ
                    break;
                }//if
            }//for
        }//for


        //最大勝利数のパターンを計算
        int maxWin = 0;
        for(Integer[] pattern : patternList) {
            int win = 0;
            win += Math.min(handCount[0], pattern[2]); //相手がグー、自分がパー
            win += Math.min(handCount[2], pattern[1]); //相手がパー、自分がチョキ
            win += Math.min(handCount[1], pattern[0]); //相手がチョキ、自分がグー
            if(win > maxWin) maxWin = win;
        }//for


        //出力
        System.out.println(maxWin);
    }//main
}//class

結果

全ての実行時間が0.10秒以内