第一回 オフラインリアルタイムどう書くの参考問題
ポーカー
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("--"); } } }