ABC373 B問題の解説(Python)

はじめに

この記事では、ABC373のB問題を解説していきます。

ABC(AtCoder Beginner Contest)とは、AtCoderが開催している、競技プログラミングコンテストです。

ABC373 B – 1D Keyboard

問題

問題

26個のキーが数直線上に並んだキーボードがあります。

このキーボードの配列は A〜Z のアルファベットを並べ替えた文字列Sで表されます。

さて、このキーボードを使って A〜Z をこの順で右手人差し指で一度だけ入力します。 ある文字を入力するためには、その文字に対応するキーの座標に指を移動させてキーを押す必要があります。

はじめ、指はAに対応するキーの座標にあります。Aに対応するキーを押してから、Zに対応するキーを押すまでの指の移動距離の合計として考えられる最小値を求める問題です。

制約

なし

思考の筋道

キーボードにおける A〜Z のインデックスを調べ、隣り合うアルファベットのインデックスの差(絶対値)を移動距離に加えていくことで解くことができます。

具体例:入力例2

S=”MGJYIZDKSBHPVENFLQURTCWOAX”のとき

  • 指ははじめAの位置(インデックス24)から始まる
    ここまでの移動距離は0。
  • 次に、Bの位置はインデックス9なので、24-9=15だけ移動する
    ここまでの移動距離は15。
  • 次に、Cの位置はインデックス21なので、21-15=6だけ移動する
    ここまでの移動距離は21。
  • 以下同様

下のコードでは、index(現在のインデックス)とnext_index(次のインデックス)の2つの変数を管理することで、移動距離を計算しています。

また、string.ascii_uppercase によって、大文字アルファベットからなる文字列 “ABCDEFGHIJKLMNOPQRSTUVWXYZ” を作成し、ループに活用しています。

コード

import string
S = input()

move = 0
index = S.find("A")

for char in string.ascii_uppercase:
  next_index = S.find(char)
  move += abs(next_index - index)
  index = next_index

print(move)

以上、ABC373のB問題の解説でした!

では、またね。

リンク