今回から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が終わったとき次の処理
- 最終文字のみ次の0がないため別の処理をする
- 塊がK個目でなければそのままリストに追加
- 塊がK個目の場合は1を先に持っていき、0を後にしてリストに追加(1の塊の移動)
- 塊を移動後、文字が続いている場合は、塊以降をそのままリストに追加。ループを抜ける
# 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までの記事は書くようにする。