AtCoder ABC5週目参戦日記

スポンサーリンク
日記
スポンサーリンク

 AtCoderも5週目になりました。

 プログラミングは奥深いです。昔、MSXやVBAでBasicをいじっていた時から数十年、かなりのブランクからPythonと出会い、プログラミングの魅力にすっかりハマってしまった自分です。でも、正直言うと、Pythonのライブラリが便利すぎて、データ処理や自動化のプログラムも、単にモジュールや関数に値を渡したりするだけの簡単なものばかりやっていて、「プログラミングには数学的なセンスが必要」って言葉がいまいちしっくりきてこなかったのです。勿論、データ処理には行列を使ったりはしていたので、それなりに線形代数を学びなおしたりはしたのですが。

 ところが競技プログラミングと出会って、難しい課題にバンバン直面して、数学的な思考の大切さを嫌というほど、思い知っております。折しも今年の春に終わった下の子の中学受験につきあって、算数の勉強をしたのも随分役に立っています。単純にコードを書くだけじゃなくて、O記法を考えて書かないと、いつまでも実行が完了しないプログラミングの課題にぶちあたったり。また、複雑な処理をミスなく行うためには、例外に頭をつかったり、ちゃんと整理して分かりやすいコートを書いたり。一見難しそうな問題で、切り口を変えたエレガントな解法を見つけて感動したり。そんなこんなで、これまで会社人生の中であまり使ってこなかった部分をフルに使っています。まだまだ自分は基本のアルゴリズムもちゃんとわかっていないので、先日、E869120氏の「アルゴリズム×数学」を入手して、その本で1から勉強しなおしています。

 さて、今回のABC261ですが、A~Cの3問ACできて、Ratingもようやく200台に乗せました。段々成長のペースが鈍っている感じはありますが、アルゴリズムの一通りの勉強が終わったころには、早く灰色ゾーンを抜けれたらと思います。

A – Intersection

 こちらの問題は、直前に読んでいた「アルゴリズム×数学」で似たような区間を求める手計算の問題をやっていたので、それをさっそく使わせていただきました。早速勉強が生きるとは。

L1, R1, L2, R2 = map(int, input().split())

A_min = max(L1, L2)
A_max = min(R1, R2)

if A_min > A_max:
    print(0)
else:
    print(A_max-A_min)

B – Tournament Result

  この問題は愚直にif文で確認して、間に合いました。でも、Nがこれ以上大きくなったら、対応できそうにない解法なので、もっと良い別解がありそうです。

N= int(input())

A = []
for i in range(N):
    A.append(input())

def test(n,a):
    for i in range(n):
        for j in range(i, n):
            if i == j:
                if a[i][j] != '-':
                    return False
            else:
                if a[i][j] == 'W':
                    if a[j][i] != 'L':
                        return False
                elif a[i][j] == 'L':
                    if a[j][i] != 'W':
                        return False
                elif a[i][j] == 'D':
                    if a[j][i] != 'D':
                        return False
                else:
                    return False
    return True

if test(N,A):
    print("correct")
else:
    print("incorrect")

C – NewFolder(1)の解法

 最初、問題の意味を理解するのに時間が掛かってしまいました。題名の通り、Windowsのファイル名で同名のファイルを作ってしまった時と同じ働きだったんですね。あと、なぜかinput()された文字列に改行コードが入ってしまい、意図したように出入力ができず、苦戦をしました。今回は、AtCoderのコードテストで確認したらよいことに気付いて、それで乗り切りましたが、次回までには、ローカルでテストできる仕組みを作りたいものです。最初、全探索でやったら、時間オーバーになったので、考えて、辞書型を使って、そこから重複数を入れるようにしました。辞書型はこんな使い方もできるんですね。。。

N = int(input())
S = []
for i in range(N):
    tmp = str(input())
    S.append(tmp)

word_dic = {S[0]:1}
print(S[0])

for i in range(1, N):
    if S[i] in word_dic:
        print(f"{S[i]}({word_dic[S[i]]})")
        word_dic[S[i]] += 1
    else:
        print(S[i])
        word_dic[S[i]] = 1
日記
スポンサーリンク
鷹の目週末プログラマー

コメント