😭

深夜に簡単なB問題やろうとしたら,久しぶりで何もできなかった

2024/10/22に公開

今回は,AtCoder Beginner Contest 373 B 問題を解いた際につまずいたポイントに関するメモを残しておきます.
久しぶりに AtCoder をやろうとしたら,B 問題すら解けなかったので,反省点をまとめておきます.

AtCoder Beginner Contest 373 B

https://atcoder.jp/contests/abc373/tasks/abc373_b

回答

s = input()

x = [0] * 26
for i in range(26):
    x[ord(s[i]) - ord("A")] = i # ord("A") = 65, ord("B") = 66, ...
    print(x) # for debug
ans = 0
for i in range(25):
    ans += abs(x[i] - x[i + 1])
print(ans)
Input:
MGJYIZDKSBHPVENFLQURTCWOAX

Output:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5]
[0, 0, 0, 6, 0, 0, 1, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5]
[0, 0, 0, 6, 0, 0, 1, 0, 4, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5]
[0, 0, 0, 6, 0, 0, 1, 0, 4, 2, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 3, 5]
[0, 9, 0, 6, 0, 0, 1, 0, 4, 2, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 3, 5]
[0, 9, 0, 6, 0, 0, 1, 10, 4, 2, 7, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 3, 5]
[0, 9, 0, 6, 0, 0, 1, 10, 4, 2, 7, 0, 0, 0, 0, 11, 0, 0, 8, 0, 0, 0, 0, 0, 3, 5]
[0, 9, 0, 6, 0, 0, 1, 10, 4, 2, 7, 0, 0, 0, 0, 11, 0, 0, 8, 0, 0, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 0, 1, 10, 4, 2, 7, 0, 0, 0, 0, 11, 0, 0, 8, 0, 0, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 0, 1, 10, 4, 2, 7, 0, 0, 14, 0, 11, 0, 0, 8, 0, 0, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 15, 1, 10, 4, 2, 7, 0, 0, 14, 0, 11, 0, 0, 8, 0, 0, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 0, 11, 0, 0, 8, 0, 0, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 0, 11, 17, 0, 8, 0, 0, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 0, 11, 17, 0, 8, 0, 18, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 0, 11, 17, 19, 8, 0, 18, 12, 0, 0, 3, 5]
[0, 9, 0, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 0, 11, 17, 19, 8, 20, 18, 12, 0, 0, 3, 5]
[0, 9, 21, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 0, 11, 17, 19, 8, 20, 18, 12, 0, 0, 3, 5]
[0, 9, 21, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 0, 11, 17, 19, 8, 20, 18, 12, 22, 0, 3, 5]
[0, 9, 21, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 23, 11, 17, 19, 8, 20, 18, 12, 22, 0, 3, 5]
[24, 9, 21, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 23, 11, 17, 19, 8, 20, 18, 12, 22, 0, 3, 5]
[24, 9, 21, 6, 13, 15, 1, 10, 4, 2, 7, 16, 0, 14, 23, 11, 17, 19, 8, 20, 18, 12, 22, 25, 3, 5]

223 (Expected Output)
解説

  • x[ord(s[i]) - ord("A")] = i の部分は,文字 Si が i 番目に出現することを記録している.

  • x は,アルファベットの出現位置を記録するリストである.

    • ABC...Z の順
  • 例えば入力が "ZABCDEFGHIJKLMNOPQRSTUVWXY" の場合,x は以下のようになる.

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0]
  • これは,A が 2 番目に出現,B が 3 番目に出現,...,Z が 1 番目に出現することを示している.
  • 最後に,隣り合う要素の差の絶対値を求めている.
    • 指の移動回数を求めることができる.

つまずいたところ

  • ord 関数の使い方がわからなかった.
    • ord関数は,文字を ASCII コードに変換する関数
    • ord("A") は 65 になる

次回への改善点

  • ここで挫折せず,毎日少しずつでも問題を解いていくようにする.
  • わからないことがあれば,すぐに調べるようにする.
  • 他の人の解答を見て,自分の解答と比較するようにする.
  • できなかった問題は,アウトプットとして残すようにする.

Discussion