2012/06/24

ポーカー

暇だったので、この問題を解いてみました。

第一回 オフラインリアルタイムどう書くの参考問題

ポーカー

5枚のカードを示す文字列を入力とし、ポーカーの役を出力せよ。
ただし:
  • 一枚のカードは、スートを表す文字+ランクを表す文字列 で構成される。
  • スートを表す文字は、S, H, D, C のいずれか
  • ランクを表す文字列は、2, 3, ..., 9, 10, J, Q, K, A のいずれか
  • 下表の役に対応すること。下表の役に該当しない場合は '--' を出力すること。
  • カードはジョーカーを含まない52枚から5枚が選ばれる。
  • 不正な入力への対応は不要。
対応すべき役と、その役だった場合に出力する文字列は以下のとおり:
  • フォーカード : 4K
  • フルハウス : FH
  • スリーカード : 3K
  • ツーペア : 2P
  • ワンペア : 1P
  • 上記のいずれにも該当しない : --
例えば、入力が「D3C3C10D10S3」ならフルハウスなので「FH」と出力する。
入力が「S8D10HJS10CJ」ならツーペアなので「2P」と出力する。

以下書いたもの。キレイでない・・・。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Poker {
 public static void main(String[] args) {
  Poker poker = new Poker();
  for(String arg : args) {
   poker.printResult(poker.getCards(arg));
  }
 }

 private List<String> getCards(String cardString) {
  List<String> cardList = new ArrayList<String>();
  for(int i = 1; i <= 5; i++) {
   cardList.add(new String(cardString.substring(1, 2)));
   cardString = cardString.substring(1, 2).equals("1") ?
     cardString.substring(3) : cardString.substring(2);
  }
  return cardList;
 }

 private void printResult(List<String> cardList) {
  String[] rank = {"2", "3", "4", "5", "6", "7", "8", "9", "1", "J", "Q", "K", "A"};
  Map<String, Integer> countMap = new HashMap<String, Integer>();
  for(String card : cardList) {
   int count = countMap.get(card) == null ? 0 : countMap.get(card);
   countMap.put(card, ++count);
  }
  boolean threeFlg = false;
  boolean twoFlg = false;
  for(int i = 0; i <= 12; i++) {
   if(countMap.get(rank[i]) == null) {
    continue;
   }
   if(countMap.get(rank[i]) == 4) {
    System.out.println("4K");
    return;
   }
   if(countMap.get(rank[i]) == 3) {
    threeFlg = true;
   }
   if(countMap.get(rank[i]) == 2) {
    if(twoFlg) {
     System.out.println("2P");
     return;
    }
    twoFlg = true;
   }
  }
  if(threeFlg && twoFlg) {
   System.out.println("FH");
  }
  else if(threeFlg) {
   System.out.println("3K");
  }
  else if(twoFlg) {
   System.out.println("1P");
  }
  else {
   System.out.println("--");
  }
 }
}