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