Official

D - Make Target Editorial by hirayuu_At


解法1:問題文通り実装する

はじめに二次元配列を作成してから問題文の通りに色を塗る方針です。たいていの言語では添字が0から始まるため、\(i,j\) の定義を適切に変更する必要があることに注意してください。詳しくは実装例も参考にしてください。

実装例 (Python3)

N = int(input())

target = [["?"] * N for _ in range(N)]

for i in range(N):
    j = N - i - 1
    if i <= j:
        for x in range(i, j + 1):
            for y in range(i, j + 1):
                if i % 2 == 0:
                    target[x][y] = "#"
                else:
                    target[x][y] = "."

for row in target:
    print("".join(row))

解法2:直接マスに塗られる色を求める

マス \((i,j)\) に塗られる色は、以下のようになります。

  • \(\min(i,j,N+1-i.N+1-j)\) が奇数ならば黒、偶数ならば白

マス \((i,j)\) が最後に塗られるのが \(\min(i,j,N+1-i.N+1-j)\) 番目の操作であることから従います。

これも、解法1と同様に添字に注意して実装すればよいです。

実装例 (Python3)

N = int(input())

target = [["?"] * N for _ in range(N)]

for i in range(N):
    for j in range(N):
        if min(i, j, N - i - 1, N - j - 1) % 2 == 0:
            target[i][j] = "#"
        else:
            target[i][j] = "."

for row in target:
    print("".join(row))

余談

より高速といえるのはどちらの解法ですか?

答え 解法2のほうが高速です。実際、\(N=5000\) として実行してみると違いが分かりやすいと思います。

ある解法の速度を考えるとき、計算量という概念を知っていると便利です。計算量を勉強するにはたとえばAPG4bの項目のひとつである W - 2.06.計算量 を読むと良いでしょう。

AtCoder Beginner Contestでは、B問題までは(ABC334-Bなど例外はありますが)基本的に計算量を意識する必要はありません。しかし、C問題以降で計算量を考えずに実装すると TLE となることがあります。より上位を目指すなら計算量を意識して解法を考えることを強くおすすめします。

posted:
last update: