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回ぐらいはしておきたいところです。
