Official
A - 本棚の整理 / Organizing the Bookshelf Editorial by admin
Claude 4.5 Opus概要
配列の中から特定の値を探し、最初に見つかった位置を求める線形探索の問題です。
考察
この問題では、\(N\) 冊の本の中から管理番号が \(K\) である本を探します。
重要な気づき
- 最も小さい位置を求める: 管理番号 \(K\) の本が複数存在する可能性があるため、最初に見つかった位置を答える必要があります
- 存在しない場合の処理: 見つからなかった場合は \(-1\) を出力します
素朴なアプローチで十分か?
本棚の本を左から順番に1冊ずつ確認していく方法(線形探索)を考えます。
- 最悪の場合、\(N\) 冊すべてを確認する必要があります
- \(N \leq 2 \times 10^5\) なので、\(O(N)\) の計算量で十分間に合います
この問題では、配列がソートされていないため、二分探索などの高速な手法は使えません。単純に先頭から順に探索するのが適切です。
具体例
例えば、\(N = 5\)、\(K = 3\)、\(A = [1, 3, 5, 3, 2]\) の場合: - \(A_1 = 1 \neq 3\) - \(A_2 = 3 = K\) → 見つかった!位置は 2
最初に見つかった時点で探索を終了し、答えは \(2\) となります。
アルゴリズム
- 配列 \(A\) の先頭から順番に要素を確認する
- \(A_i = K\) となる \(i\) が見つかったら、その位置 \(i + 1\)(1-indexed)を記録して探索を終了する
- 最後まで見つからなければ \(-1\) を出力する
result = -1
for i = 0 to N-1:
if A[i] == K:
result = i + 1
break
print(result)
計算量
- 時間計算量: \(O(N)\)
- 最悪の場合、配列のすべての要素を1回ずつ確認します
- 空間計算量: \(O(N)\)
- 入力の配列 \(A\) を保存するために必要です
実装のポイント
1-indexed と 0-indexed の変換: 問題では「左から何番目か」を1から数えますが、プログラムの配列は0から始まるため、出力時に
i + 1とする必要がありますbreak文の使用: 最も小さい位置を求めるため、最初に見つかった時点で
breakしてループを抜けます。これを忘れると、最後に見つかった位置が出力されてしまいます初期値の設定:
result = -1と初期化しておくことで、見つからなかった場合の処理を簡潔に書けますソースコード
N, K = map(int, input().split())
A = list(map(int, input().split()))
result = -1
for i in range(N):
if A[i] == K:
result = i + 1
break
print(result)
この解説は claude4.5opus によって生成されました。
posted:
last update: