トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.267 トランプソート

■■■問題■■■

友達とトランプで遊ぶことにしました。
カードを配ってもらいましたが、手札のカードを順番に並べないと気が済みません。
カードを順番通りに並び替えてください。

カードは左から順にダイヤ、クローバー、ハート、スペードの順に並べます。
マークごとに左から順に数字の小さい順に並べます。

■■■入力■■■

N
m1n1 m2n2 ・・・ mNnN

1行目にカードの枚数が与えられる。
2行目にカードの情報が空白区切りで与えられる。

1 <= N <= 52
カードはminiで表され、miがマーク、niが数字を表す。
マーク D:ダイヤ、C:クローバー、H:ハート、S:スペードを表す。
数字   2〜9:それぞれの数字、A:1、T:10、J:11、Q:12、K:13を表す。

同じマークで同じ数字のカードは与えらない。

■■■出力■■■

ソート後のカードを空白区切りで表示してください。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("4");
            WillReturn.Add("H2 D2 S2 C2");
            //D2 C2 H2 S2
            //D、C、H、Sの順に並べます
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("5");
            WillReturn.Add("ST SA SK SQ SJ");
            //SA ST SJ SQ SK
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("6");
            WillReturn.Add("S4 SA C5 C4 CA DA");
            //DA CA C4 C5 SA S4
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        string[] CardArr = InputList[1].Split(' ');
        int UB = CardArr.GetUpperBound(0);

        Array.Sort(CardArr, (A, B) =>
        {
            int A_P1 = DeriveMarkPriority(A), A_P2 = DeriveNumPriority(A);
            int B_P1 = DeriveMarkPriority(B), B_P2 = DeriveNumPriority(B);

            int wkInt = A_P1.CompareTo(B_P1);
            if (wkInt != 0) return wkInt;
            return A_P2.CompareTo(B_P2);
        });

        Console.WriteLine(string.Join(" ", CardArr));
    }

    //マークのプライオリティを返す
    static int DeriveMarkPriority(string pStr)
    {
        if (pStr[0] == 'D') return 1;
        if (pStr[0] == 'C') return 2;
        if (pStr[0] == 'H') return 3;
        if (pStr[0] == 'S') return 4;
        return 0;
    }

    //数字のプライオリティを返す
    static int DeriveNumPriority(string pStr)
    {
        if (pStr[1] == 'A') return 1;
        if (pStr[1] == 'T') return 10;
        if (pStr[1] == 'J') return 11;
        if (pStr[1] == 'Q') return 12;
        if (pStr[1] == 'K') return 13;
        return pStr[1] - '2' + 2;
    }
}


解説

Array.Sortメソッドでソートしてます。