業務のためのC#・C言語・C++学習

主にC#の文法やWPF周りのアウトプットに利用してます。

【C#】第二回アルゴリズム検定実技検定 過去問解答例

Aエレベータ

問題

下から順に B9, B8, ..., B1, 1F, 2F, ..., 9F と呼ばれる 18 のフロアを持つ建物があります。 この建物のエレベーターは、隣接する 2 つのフロア間の移動に常に 1 秒を要します。例えば、B9 から 9F への移動には 17 秒を要し、反対方向も同様です。 2 つのフロア S, T が与えられます。エレベーターが S から T へ移動するには最短で何秒を要するでしょうか。

解法

フロア名から階数、地下階、地上階かを判断するため文字列の切り取りをするインデクサー[]を利用。 地下と地上の移動時間の算出には、階数の引き算では0階がないためうまくいかない。そこで地下の階数にあえて+1を加える。

            var input = Console.ReadLine().Split();
            var s = input[0];
            var t = input[1];

            int si=0;
            if (s[0] == 'B')
            {
                si = -int.Parse(s[1].ToString())+1;
            }
            else if(s[1] == 'F')
            {
                si = int.Parse(s[0].ToString());
            }

            int ti=0;
            if (t[0] == 'B')
            {
                ti = -int.Parse(t[1].ToString())+1;
            }
            else if (t[1] == 'F')
            {
                ti = int.Parse(t[0].ToString());
            }
            var result = Math.Abs(si - ti);
            Console.WriteLine(result);

B多数決

文字列の切り取りをするインデクサー[]を利用

問題

ある国で選挙が行われました。候補者は a, b, c の 3 名です。

投票されたすべての票を表す文字列 S が与えられます。 S は英小文字 a, b, c からなり、 S の i 文字目は i 番目の投票者が投票した候補者を表します。最多得票を得た候補者は誰か求めてください。

なお、最多得票を得た人物はちょうど 1 名であることが保証されています。

解法
            var s = Console.ReadLine();

            int counta = 0;
            int countb = 0;
            int countc = 0;
            for (int i = 0; i < s.Length; i++)
            {
                if (s[i].ToString() == "a")
                {
                    counta++;
                }
                else if (s[i].ToString() == "b")
                {
                    countb++;
                }
                else { countc++; }
            }
            if (counta > countb && counta > countc)
            {
                Console.WriteLine('a');
            }
            else if (countb > counta && countb > countc)
            {
                Console.WriteLine('b');
            }
            else { Console.WriteLine('c'); }

C

ジャグ配列の操作を行う。
ジャグ配列はまず行の要素数を決めその後に列の要素数を決める。

問題

https://atcoder.jp/contests/past202004-open/tasks/past202004_c

        static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            string[][] S = new string[N][];
            for (int i = 0; i < N; i++)
            {
                S[i] = new string[2 * N - 1];
                var input = Console.ReadLine();
                for (int j = 0; j < 2 * N - 1; j++)
                {
                    S[i][j] = input[j].ToString();
                }
            }


            for (int i = N-2; i >= 0; i--)
            {
                for (int j = 1; j < 2 * N - 2; j++)
                {
                    if (S[i][j] == "#")
                    {
                        
                        if (S[i + 1][j - 1] == "X" || S[i + 1][j] == "X" || S[i + 1][j + 1] == "X")//
                        {
                            S[i][j] = "X";
                        }
                    }
                }

            }

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < 2 * N - 1; j++)
                {
                    Console.Write(S[i][j]);
                }
                Console.WriteLine("");
            }

        }