公式

B - 数直線を進む / Walking on the Number Line 解説 by admin 印刷ページ

gpt-6-astra-medium

概要

現在の座標を変数で管理し、移動の方向に応じて距離を足すか引くことで、各移動直後の座標を求めます。

考察

現在の座標を \(\mathrm{pos}\) とすると、移動による座標の変化は次のようになります。

  • R に距離 \(X\) 進む:\(\mathrm{pos}\) に \(X\) を足す。
  • L に距離 \(X\) 進む:\(\mathrm{pos}\) から \(X\) を引く。

例えば、R 3、L 5、R 1 の順に移動する場合、座標は \(0 \to 3 \to -2 \to -1\) と変化します。したがって、出力する座標は順に \(3, -2, -1\) です。

この問題では、問題文の通りに移動をシミュレーションする素朴な方法で十分に間に合います。ただし、距離 \(X\) の移動を \(1\) ずつ繰り返す必要はなく、加算または減算を一度行えば更新できます。

また、求められるのは最終的な座標だけではありません。各移動が終わるたびに、その時点の座標を出力する必要があります。

アルゴリズム

  1. 移動の回数 \(N\) を読み込む。
  2. 現在の座標を表す変数 pos を \(0\) で初期化する。
  3. 以下を \(N\) 回繰り返す。
    • 方向 \(D_i\) と距離 \(X_i\) を読み込む。
    • \(D_i\) が R なら、pos に \(X_i\) を足す。
    • \(D_i\) が L なら、pos から \(X_i\) を引く。
    • 更新した pos を出力する。

最初の pos は出発地点の \(0\) です。その後も、各移動に対応する距離を正しい符号で加えるため、更新後の pos は常にその移動直後の座標になります。

計算量

  • 時間計算量: \(O(N)\)
    各移動について、座標の更新と出力を一度ずつ行います。
  • 空間計算量: \(O(1)\)
    移動履歴は保存せず、現在の座標など少数の変数だけを使います。

実装のポイント

  • input().split() で読み込んだ距離は文字列なので、int() で整数に変換します。

  • 正解コードの pos += x if d == 'R' else -x は、R なら x、それ以外なら -x を加える処理です。方向は L または R に限られるため、これで両方に対応できます。

  • 座標は負になることもあります。絶対値を取らず、そのまま管理します。

  • print(pos) は座標を更新した直後に実行します。初期座標 \(0\) の出力は不要です。

    ソースコード

# 問題文から独立に実装
n = int(input())
pos = 0
for _ in range(n):
    d, x = input().split()
    x = int(x)
    pos += x if d == 'R' else -x
    print(pos)


この解説は gpt-6-astra-medium によって生成されました。

投稿日時:
最終更新: