C# Cランクレベルアップメニュー ~ソート~

システムエンジニアの研修の１つに「paizaBランク問題をクリア」があるのでその目標を達成するまでの過程を備忘録として残します。

今後業務に参加していく際に記述方法を忘れてしまった未来の自分に向けて、メモを残すと同時にこの記事がC#を学習している方、同じ箇所で躓いている方の参考になればと思っています。
ですので内容に誤りがある場合やより良い記述をご存知の方はコメントで共有していただけると嬉しいです。

## STEP: 1 昇順ソート
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_sort_step1

```c#:paiza.cs
using System;

class Program
{
    static void Main()
    {
        int line = int.Parse(Console.ReadLine());
        int[] numArray = new int[line];
        for(var i = 0; i < line; i++){
            numArray[i] = int.Parse(Console.ReadLine());
        }
        Array.Sort(numArray);
        for(var j = 0; j < line; j++){
            Console.WriteLine(numArray[j]);
        }
    }
}
```


##  STEP: 2 降順ソート
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_sort_step2

```c#:paiza.cs
using System;

class Program
{
    static void Main()
    {
        int line = int.Parse(Console.ReadLine());
        int[] numArr = new int[line];
        for(var i = 0; i < line; i++){
            numArr[i] = int.Parse(Console.ReadLine());
        }
        Array.Sort(numArr);
        Array.Reverse(numArr);
        
        for(var j = 0; j < line; j++){
            Console.WriteLine(numArr[j]);
        }
    }
}
```



##   STEP: 3 辞書式ソート
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_sort_step3
参考記事:http://chuckischarles.hatenablog.com/entry/2019/07/01/101727
この問題はかなり時間がかかってしまいました。
二次元配列をどうやってソートするかが今回のポイントでしたね。

```c#:paiza.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;


class Program
{
    static void Main()
    {
        // ループする回数取得
        int iDataNum = int.Parse(Console.ReadLine()); 
        // 2 次元配列のように扱える List の定義
        var varList = new List<List<int>>();  
        // List に要素を代入する
        for (int i = 0; i < iDataNum; i++){
            var array_1D_ab = Console.ReadLine().Split(' ');
            // i 行目の要素に List を作成する
            varList.Add(new List<int>());
            
            // i 行目の要素を作成・追加する
            for (int j = 0; j < 2; j++)
            {
            // 要素の追加
                varList[i].Add(int.Parse(array_1D_ab[j]));
            }
        }
        // List をジャグ配列に変換する
        var varArray = varList.Select(line => line)
                              .Select(line_child => line_child.ToArray())
                              .ToArray();
        // ジャグ配列をソートする
        Array.Sort(varArray, StructuralComparisons.StructuralComparer);
        Array.Reverse(varArray);
        // 出力
        for (int i = 0; i < varArray.Length; i++)
        {
            for (int j = 0; j < varArray[i].Length; j++)
            {
                // j 列目が最後の要素なら
                if (j + 1 == varArray[i].Length)
                {
                    // 末尾改行あり出力
                    Console.WriteLine(varArray[i][j]);
                }
                // j 列目が最後の要素では無いなら
                else
                {
                    // 末尾改行なし出力
                    Console.Write(varArray[i][j] + " ");
                }
            }
        }
    }
}
```

##   FINAL問題 ソート
問題文:https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_sort_boss
この問題は時短のため前のプログラムを流用してます

```c#:paiza.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        // ループする回数取得
        int iDataNum = int.Parse(Console.ReadLine()); 
        // 2 次元配列のように扱える List の定義
        var varList = new List<List<int>>();  
        // List に要素を代入する
        for (int i = 0; i < iDataNum; i++){
            var array_1D_ab_original = Console.ReadLine().Split(' ');
            int[] array_1D_ab = new int[2] { int.Parse(array_1D_ab_original[1]), int.Parse(array_1D_ab_original[0])};
            
            // i 行目の要素に List を作成する
            varList.Add(new List<int>());
            // i 行目の要素を作成・追加する
            for (int j = 0; j < 2; j++)
            {
                // 要素の追加
                varList[i].Add(array_1D_ab[j]);
            }
        }
        // List をジャグ配列に変換する
        var varArray = varList.Select(line => line)
                              .Select(line_child => line_child.ToArray())
                              .ToArray();
        // ジャグ配列をソートする
        Array.Sort(varArray, StructuralComparisons.StructuralComparer);
        Array.Reverse(varArray);
        // 出力
        for (int i = 0; i < varArray.Length; i++)
        {
            for (int j = 0; j < varArray[i].Length; j++)
            {
                // j 列目が最後の要素なら
                if (j + 1 == varArray[i].Length)
                {
                    // 末尾改行あり出力
                    Console.WriteLine(varArray[i][j - 1]);
                }
                // j 列目が最後の要素では無いなら
                else
                {
                    // 末尾改行なし出力
                    Console.Write(varArray[i][j + 1] + " ");
                }
            }
        }
    }
}
```