技術

PythonでAtCorder257 (A〜B)

先週末のAtCorder 257、飲みに行ってしまい参加できませんでした。今日の258も所用で参加できそうにありません。

257からもう1週間経ってしまいましたが、今後もAtCorderは習慣にしようと思っているので、とりあえず問題解いてみました。

A, Bしかできず。Cはまったく手も足も出ませんでした。Dは問題見て最短経路探索系のダイクストラの問題だなということはわかったのですが、ダイクストラはまだ勉強したことがないので、すぐに諦めました。

【A】 A to Z String 2

提出したコードはこちら

import string

az = list(string.ascii_uppercase)

N, X = map(int, input().split())

s = ""
for azs in az:
    s += azs * N
print(s[X - 1])

【B】1D Pawn

提出したコードはこちら

N, K, Q = map(int, input().split())
A = list(map(int, input().split()))
L = list(map(int, input().split()))

for l in L:
    # print(A)
    masu_location = A[l - 1]
    if masu_location == N:  # 一番右
        continue

    if l == K:  # 一番右でないけど最後の配列
        A[l - 1] = masu_location + 1
        continue

    if masu_location + 1 == A[l]:  # 右のマスにある
        continue
    else:
        A[l - 1] = masu_location + 1

# print('==========')
print(*A)

場合分けでやっていきました。サンプルを何回か実行しながら、ちょいちょい修正していきました。

Robot Takahashi

コード提出にもいたらず。手も足もでませんでした。

ビット全探索でもなさそうだし、バイナリサーチでもなさそう。全探索に一工夫加えてもできそうない、って感じで何やって良いかわからず。

で、解説をみました。何となく言っていることわかったのですが、コードに落とし込むことが未だにできていません。

解説に

なお、体重によってソートするときには c++ であれば std::pair 等を用いたり、python であれば 2 次元の list を適切な条件でソートする事で 体重の数値と大人か子供かの情報をセットにしてソートをすることができます。

のコメントがあるのですが、この部分がPythonでやる方法がわからず。

ググっても列基準のソートや、全要素をソートしてしまう方法しかわかりませんでした。体重をソートしてそれに追随して子ども/大人の文字列をソートすることができませんでした。

Numpyのargsortを駆使して頑張ればできそうではありますが、ここを頑張っても本題とはずれてしまうので、今日は諦めました。

多次元配列のソートは、AtCoderでも今後出てきそうなので、近いうちに再チャレンジする予定です。

まとめ

AtCorder257は参加できなかったのですが、参加していてもA,Bしか解けないという散々な結果になっていました。

今日のも参加できないのですが、このまま過去問をほとんど解かずに参加していても結局、A,BときどきCができるというのが続くだけなので、あまり意味ない気がしています。

どこかでまとめて勉強したいのですが、時間がないのと、それ以上にモチベーションがなくなっていきているので、行動に移せていません・・・😱