Study

AtCorder250

AtCorder 250に参加しました。

今回で2回目の参加と思ったのですが、プロフィールを見たら3回目になっていました。

どうやら参加できなかった248が、前日に参加登録していたため参加扱いだったらしいです。当然0点。

こんなこともあるんですね。注意せねば。

(まあ、ABの2問しか解けないザコなので、0点でもたいした影響はないのですが😭)

結果

前回同様、A、Bの2問しか解けず・・・

万年灰色の人生が現実味を帯びてきました😱

しっかりと復習していきたいと思います。

参考にする回答はこちら
https://qiita.com/u2dayo/items/5c021016d11f125e3c0b

A Adjacent Squares

提出したコードはこちら

h, w = map(int, input().split())
r, c = map(int, input().split())

ans = 0
if h==1 and w==1:
    ans = 0
elif h == 1:  # line=1
    if c == 1 or c == w:
        ans = 1
    else:
        ans = 2
elif w == 1:  # row=1
    if r == 1 or r == h:
        ans = 1
    else:
        ans = 2
else:  # square
    # corner: ans 2
    if r == 1 and (c == 1 or c == w):
        ans = 2
    elif r == h and (c == 1 or c == w):
        ans = 2
    # frame: ans 3
    elif r == 1 and 1 < c < w:
        ans = 3
    elif r == h and 1 < c < w:
        ans = 3
    elif c == 1 and 1 < r < h:
        ans = 3
    elif c == w and 1 < r < h:
        ans = 3
    # inbody: ans 4
    else:
        ans = 4

print(ans)

いや、汚くて恥ずかしいコードなのは百も承知です。もっと綺麗な書き方はあることは、わかっています。

でも本番は時間が限られているので、とにかくクリアすることを目的としたらこんなコードになってしまいました。

解説のコードがスマートすぎる!!

4方向の隣マスの座標の存在可否を調べればいいんですね。その発想はありませんでした。

こういった解法が閃くのは、天性のものなのでしょうか。それとも問題慣れなのでしょうか。単純にアルゴリズムの勉強を続けていっても、この域になれる気がしないのですが・・・

B Enlarged Checker Board

提出したコードはこちら

n, a, b = map(int, input().split())

x_line = ''
x_line_rev = ''
for j in range(n):
    if (j + 1) % 2 == 1:  # 奇数は. 偶数は#がB個ずつ加算
        x_line += '.' * b
        x_line_rev += '#' * b
    else:
        x_line += '#' * b
        x_line_rev += '.' * b

# a個ずつ、x_lineとx_line_revをprint
for i in range(a*n):
    if i // a % 2 == 0:
        print(x_line)
    else:
        print(x_line_rev)

こちらも解説は、最初に最大の10×10マスを作ってしまうというスマートな発想。これも思いつきませんでした。

が、これはまあ、考え方自体はそんなに変わらなそうなので、とりあえず良しとします。

C Adjacent Swaps

とりあえず単純に組んだらTLEは明確だったので、dictにボールの位置と値を記録して最後にボールを並べるというアプローチでこころみたのですが、コードがグチャグチャになり、ACならずでした。

解説を見る限り、考え方の方向性自体は会っていたぽいですが、解説コードを見てもよくわからず・・・ 写経してデバッグして、無理矢理納得しましたが、同じタイプの問題が出てきたら解ける気がしないです。どうしましょう・・・

ここで時間目一杯つかってしまい、D問題は見ることなく終了となりました。

まとめ

前回に引き続き、A,Bしか解けませんでした。C, Dの解説を読んでもいまいち理解できませんでした。

まるで成長していないですね。前回から2週間の間、競プロ関連の勉強はほとんどできなかったので、当然と言えば当然かもしれませんが。

次回まで最低でも、書籍『新・明解Pythonで学ぶアルゴリズムとデータ構造』完読と、過去問2回ぐらいはしておきたいところです。