0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder ABC380 振り返り (Python A~C)

Posted at

今回からAIが原則禁止になりました。AIに頼ることが多かったので今回の改定は個人的に嬉しいです。さて、本番ではA,Bの2完でしたが、Cまで書きます。Cはコンテスト中の考察をコンテスト後にACしたコードです。

A問題

問題概要

6桁の正整数が与えられる。各桁の1,2,3がそれぞれ1,2,3個ずつあるか判定しなさい。

解答

正整数を文字列のリストで受け取りソート、これが"122333"と同じか判定

n = list(input())
n.sort()
print("Yes" if "".join(n) == "122333" else "No")

ABC377のA問題でほぼ同じ問題が出ました。

B問題

問題概要

||の間の-数を数える

解答

最初の文字は|固定なので、次の文字からカウントする。|が来たらカウントをリストに追加して、カウントを0にする

s = input()

ans = []
count = 0
for i in range(1, len(s)):
    if s[i] == "|":
        ans.append(count)
        count = 0
    else:
        count += 1

print(*ans)

C問題

問題概要

文字列の中で1が連続している塊を見つける。K-1個目の塊の直後にK個目の塊を移動させる。

解答

  1. それぞれの数字を数えていき、連続する1が終わったとき次の処理
  2. 最終文字のみ次の0がないため別の処理をする
  3. 塊がK個目でなければそのままリストに追加
  4. 塊がK個目の場合は1を先に持っていき、0を後にしてリストに追加(1の塊の移動)
  5. 塊を移動後、文字が続いている場合は、塊以降をそのままリストに追加。ループを抜ける
# K番目の直前の0の塊とK番目の1の塊を調べ、入れ替える
n, k = map(int, input().split())
s = list(input())

count_zero = 0
count_one = 0
count_block = 0
is_start = False
is_stop = False
t = []  # 変更後の文字列
for i in range(n):
    # 1の塊
    if s[i] == "1":
        is_start = True
        count_one += 1
        # 最終文字のみ別処理
        if i == n - 1:
            count_block += 1
            is_stop = True
    else:
        # 1の塊終了
        if is_start:
            is_stop = True
            count_block += 1
        else:
            # 0の塊
            count_zero += 1
    # 関係ない区間
    if is_stop and count_block != k:
        t.extend(s[i - (count_zero + count_one) : i])
        is_start = False
        is_stop = False
        count_one = 0
        count_zero = 1
    # 交換する場合
    elif is_stop and count_block == k:
        t.extend(["1"] * count_one)
        t.extend(["0"] * count_zero)
        if i != n - 1:
            t.extend(s[i:])
        break

# print(len(t))
print("".join(t))

反省

Kが存在する塊の数と誤解し、すべての塊を移動するものだと思っていた。
入力例1が明らかに考察と異なるも、焦りから頭が働かずこの思考から抜け出せなかった。

感想

AIが禁止になった嬉しさと、少し精進したため、良いパフォーマンスを出したいという焦りから結果的にレートを下げてしまった点は反省しなければならない。
また、今後はコンテストの結果にかかわらずCまでの記事は書くようにする。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?