「進捗いいわけマーク」問題の公開期限が終了したということで、自分の提出コードを公開したいと思います。利用言語は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が出ているため、解答を公開しています。