白俊-14696号(絵遊び)


質問元:https://www.acmicpc.net/problem/14696
質問する

  • 二人の子供A,Bは絵を描いている.絵遊びのルールは以下の通りです.二人の子供は最初は何枚もの絵を持っていて、輪ごとに自分の絵を1枚ずつ出しています.絵には星(★)、円(●)、四角(■)、三角形(▲)、4つの形のうちの1つまたは複数の形があります.二人の子供の絵の中でどちらが強いかは、以下のルールに従います.

  • 2つの星の数が違うと、多くの星の1つの星が勝つ.

  • 星の数が同じで、円の数が違うと、円の多い方の絵が勝つ.

  • 星や円の個数が等しく、角の個数が異なると、角の多い方の絵が勝つ.

  • 星、円、四角の個数が等しく、三角形の個数が異なると、三角形の多い方の絵が勝つ.

  • 星、円、四角、三角形の個数が等しい場合、それは引き分けです.

  • 例えば、二人の子供A、Bのカードは下図のようになります.

  • 上のルールでは、Aの絵には星があり、Bの絵には星がないので、勝者はAです.上図が第1ラウンドの場合、第2、3、4、5ラウンドの場合は下表のように、第2、3、4ラウンドの勝者はそれぞれB、B、A、第5ラウンドは引き分けとなり、Dで示す.

  • 星、円、四角形、三角形はそれぞれ数字4、3、2、1で表されます.例えば、第1ラウンドでは、子供Aが出した絵★は4で表現でき、子供Bが出した絵●▲は3 3 3 2 1で表現できる.

  • ラウンド数Nと2人の子供が順番にカードを出すカードの情報を得た場合は、ラウンドごとにカードゲームの結果を求めるプログラムを作成してください.
  • import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
    
        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
            int ROUND = Integer.parseInt(reader.readLine());
    
            for (int i = 0; i < ROUND; i++) {
                int[] cardA = new int[4]; // A의 카드 그림
                int[] cardB = new int[4]; // B의 카드 그림
                StringTokenizer tokenizer = new StringTokenizer(reader.readLine()); // 각 라운드별 A의 선택
                int numA = Integer.parseInt(tokenizer.nextToken());
                for (int j = 0; j < numA; j++) {
                    cardA[Integer.parseInt(tokenizer.nextToken()) - 1]++;
                }
    
                tokenizer = new StringTokenizer(reader.readLine()); // 각 라운드별 B의 선택
                int numB = Integer.parseInt(tokenizer.nextToken());
                for (int j = 0; j < numB; j++) {
                    cardB[Integer.parseInt(tokenizer.nextToken()) - 1]++;
                }
    
                boolean flag = false;
    
                for (int j = 3; j >= 0; j--) {
                    if (cardA[j] - cardB[j] != 0) { // 별의 갯수가 다름
                        sb.append(cardA[j] > cardB[j] ? "A" : "B");
                        flag = true;
                        break;
                    }
                }
    
                if (!flag) sb.append("D");
    
                sb.append("\n");
            }
    
            System.out.println(sb);
        }
    
    }
  • 優先順位により、各形状の個数を比較するだけでよい.
  • で入力された数字をインデックスとし、数の配列を維持するように、それらの値を1つずつ比較することによって実現される.
  • などのインデックスを持つ2つの配列の値が異なる場合、より多くの人が勝ったとみなされます.