「恋するハッカソン」の「「制服」ゲットチャレンジ!」がクリアできない


問題チャレンジ中の人にはヒントになるので閲覧注意です。

完全に詰んでるっぽいので後で挑戦するまでコードを寝かせておこうと思う。

テストケース2までは通過するのだが、テストケース3で5.00秒で通過しない。
時間切れか?ループの問題?

いまは間違っているところが見つからない。

こんなときは時間をおいて見直す必要がありそうだ。

uniform.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    public static void Main()
    {
        string[] inputCardOrder = Console.ReadLine().Split(' ');//最初に入力されるカードの並び順
        List<int> cardOrder = new List<int>(52);//残りカードリスト
        //-最初に入力されたカードの並び順でカードリストを作るついでに、J,Q,K,A,2のカードの強さを正しい整数値に変換しながら、カードリスト化する 3<4<5...<10<J<Q<K<A<2
        foreach (string ic in inputCardOrder)
        {
            if (ic == "A") { cardOrder.Add(14); }
            else if (ic == "2") { cardOrder.Add(15); }
            else if (ic == "J") { cardOrder.Add(11); }
            else if (ic == "Q") { cardOrder.Add(12); }
            else if (ic == "K") { cardOrder.Add(13); }
            else
            {
                cardOrder.Add(int.Parse(ic));
            }
        }
        List<int> playerRanking = cardOrder.ToList();

        //-プレイヤーの順位を計算する
        int fieldCard = -1;//場に出ているカード(-1で初期化しているのは最初のプレイヤーのカードが必ず勝利判定を通過させるために)
        int indexOfOwnerOfFieldCard = -1;
        int countOfPlayerRank = 1;
        for (int i = 0; i < 52; i++)
        {
            if (i == indexOfOwnerOfFieldCard)//--2.フィールドに出されたカードのオーナーの手番が一周回ってきてしまったとき
            {
                    while (cardOrder[i] == -1)
                    {
                        if (i < 51) i++;
                        else i = 1;
                        fieldCard = cardOrder[i] - 1;
                    }
            }else{}

            int currentPlayerCard = cardOrder[i];//--1.
            if (fieldCard < currentPlayerCard)//場に出ているカードに現在のプレイヤーの持ちカードが勝利する場合
            {
                fieldCard = currentPlayerCard;
                indexOfOwnerOfFieldCard = i;
                playerRanking[i] = countOfPlayerRank;
                countOfPlayerRank++;
                cardOrder[i] = -1;
            }else{}
            if (countOfPlayerRank > 52) { break; }//52位まで決まったらメインループを抜け出す
            else { }
            if (51 <= i && indexOfOwnerOfFieldCard != 51) { i = 1; }
            else if (51 <= i && indexOfOwnerOfFieldCard == 51) { i = 50; }
            else { }
        }

        //-回答を出力する
        foreach (var rank in playerRanking)
        {
            Console.WriteLine(rank);
        }
    }
}

けど塩漬けになりそうだなあ。。。
どこかで質問することも頭の片隅に置いておく。

追記(2018/06/05/10:38)
メインのループにカウンタを仕込んで1000万回以上のループがあった場合は
break;するようにしたら、テストケース3は0.10秒でテスト失敗となった。
入力によっては何かしらループが失敗する原因になるということだと思う。
何が原因でどう対処すればよいだろうか?
いや、このカウンタはそもそも無意味じゃないか?
本来は一億回目のループで結果が出るところを単純にループ回数制限で前倒ししてテスト失敗してるだけかもしれないし。
わからなくなってきた。考えなくては。