LoginSignup
1
1

More than 5 years have passed since last update.

CodeIQ「進捗いいわけマーク」問題に参加しました。

Posted at

「進捗いいわけマーク」問題の公開期限が終了したということで、自分の提出コードを公開したいと思います。利用言語はC#。ここ2-3か月C#の勉強中のため、腕試し的に解いてみました。

using System;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        var x = int.Parse(Console.ReadLine());
        var ans = Draw(x);
        Console.WriteLine(ans);
    }

    public static string Draw(int x)
    {
        if (x % 2 == 0)
        {
            return "invalid";
        }

        var mid = x / 2;
        var matrix = Enumerable.Range(0, x).Select((i) => Enumerable.Repeat(".", x).ToList()).ToList();
        foreach (var i in Enumerable.Range(0, x))
        {
            foreach (var j in Enumerable.Range(0, x))
            {
                if (j == mid || ((i == 0 || i == x - 1) && (j == mid - 1 || j == mid + 1)))
                {
                    matrix[i][j] = "i";
                }
            }
        }

        return string.Join(System.Environment.NewLine, matrix.Select((row) => string.Join("", row)));
    }
}

まず.で埋められたn×nの二次元配列を準備し、その要素をすべてなめながら、適切な位置iに置き換えるというロジックになります。ただ改めて見返してみると――もうちょっと書きようがあったような気がします(´・ω・`) とくに「二次元配列の要素をすべて探索する」部分は計算量が$O(n^2)$になるということもあり、見直したい。今回はnの制約が1-100と小さかったからTLEしませんでしたが……。

あとはLINQをもう少しうまく使いこなしたいですね。上記のコードだと二次元配列の生成と初期化ぐらいにしかLINQを利用していません。LINQは高機能でかつ可読性にも優れているので、活用してきたいですね。まあC#初心者ということで許してください(´・ω・`)

お断り:CodeIQの解答を公開するのはサービスの性質上、基本的にはNGですが、出題者が了承する場合はOK--という運用というか風潮があります。今回は出題者である@tbpgrさんのOKが出ているため、解答を公開しています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1