Help us understand the problem. What is going on with this article?

【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秒以内

じゃんけんの出し方_結果.png
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした