java トランプの不足カードを表示してみる、ただし、ジョーカーは考慮せず

トランプ大統領って、190cmもあるんだ...

ドナルド・ジョン・トランプは、アメリカ合衆国の実業家、政治家。第45代アメリカ合衆国大統領。 歴代最高齢で就任した大統領であり、また史上初の政治や軍人の経験がない大統領でもある。身長6フィート3インチ。

ドナルド・トランプ - Wikipedia

※ フィート、インチは下記参照

フィート・インチ換算表

 

というわけで、今回は、トランプの不足カードを表示してみようって話です、Javaでね。

今回も、

AIZU ONLINE JUDGE: Programming Challenge

f:id:ts0818:20190105103044p:plain

⇧  こちらのサイトの問題ですね。

では、レッツ~トライ。

 

トランプの不足カードを表示してみる

そも、トランプとは? 

トランプは、日本ではカードを使用した室内用の玩具を指すために用いられている用語で、もっぱら4種各13枚の計52枚(+α)を1セットとするタイプのものを指して言うことが多い。「プレイング・カード」「西洋かるた」とも。多種多様なゲームに用いられるほか、占いの道具としても手品(マジック)の小道具としてもよく用いられる。

トランプ - Wikipedia

⇧ 「(+α)」 は、JOKER のことですかね、今回は、JOKER は除外します。

問題はこんな感じ。

f:id:ts0818:20190105110643p:plain

では、ソースは、

package aizu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class TestJugdeCards {
  
  // トランプの「絵柄」用のEnumクラス
  static enum CardDesign {
    S(0), H(1), C(2), D(3);
    private int id;
    public int getId() {
      return this.id;
    }
    private CardDesign (int id) {
      this.id = id;
    }
  }

  public static void main(String[] args) throws NumberFormatException, IOException {
    // 標準入力を受け取る用
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

    // トランプの数のマトリックス用
    boolean[][] checkInput = new boolean[4][13];
    // 標準入力(トランプの枚数)
    int inputCards = Integer.parseInt(input.readLine());
    int inputNumberOfCards; // トランプの各カードの数字用

    // 標準入力(トランプの枚数)の回数だけ繰り返し
    for (int i = 0; i < inputCards; i++) {
      // 標準入力を、「絵柄」と「数字」に分ける
      String[] inputCardsArray = (input.readLine()).split("\\s");
      // トランプの各カードの数字
      inputNumberOfCards = Integer.parseInt(inputCardsArray[1]);
      
      // 「絵柄」(「スペード」「ハート」「クラブ」「ダイヤ」)で場合分け
      switch(CardDesign.valueOf(inputCardsArray[0])) {
      case S: // 「スペード」
        checkInput[0][(inputNumberOfCards -1)] = true;
        break;
      case H: // 「ハート」
        checkInput[1][(inputNumberOfCards -1)] = true;
        break;
      case C: // 「クラブ」
        checkInput[2][(inputNumberOfCards -1)] = true;
        break;
      case D: // 「ダイヤ」
        checkInput[3][(inputNumberOfCards -1)] = true;
        break;
      }
    }

    // 「絵柄」の数だけ繰り返し
    for (int i = 0; i < CardDesign.values().length; i++) {
      // 「絵柄」に対応する枚数(13枚)だけ繰り返し
      for (int j = 0; j < checkInput[1].length; j++) {
        // 標準入力で、入力されなかったカードを表示
        if (!checkInput[i][j]) {
          System.out.println(CardDesign.values()[i] + " " + (j +1));
        }
      }
    }
  }
}

で、実行してみる。

f:id:ts0818:20190105105206p:plain

f:id:ts0818:20190105105231p:plain

標準入力が、3枚の場合

3
S 12
D 1
C 3

S 1
S 2
S 3
S 4
S 5
S 6
S 7
S 8
S 9
S 10
S 11
S 13
H 1
H 2
H 3
H 4
H 5
H 6
H 7
H 8
H 9
H 10
H 11
H 12
H 13
C 1
C 2
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 12
C 13
D 2
D 3
D 4
D 5
D 6
D 7
D 8
D 9
D 10
D 11
D 12
D 13

という感じで、不足カードが表示されています。

OKも出た感じです。

f:id:ts0818:20190105105911p:plain

 

標準のJava APIでは、重複したKeyを扱う場合は、Mapを使うとValue(値)が上書きされてしまうので、Arrayで、2次元配列とかで実現するしかない感じですかね...

Googleが、重複したKeyのMapを実現するAPIを作ってるみたいです。

blog.y-yuki.net

github.com

⇧ 「guava」ってライブラリの中の、「com.google.common.collect.Multimap」ってAPIで重複したKeyのMapを実現できると。

勉強していかねばですね。

今回はこのへんで。