貪欲で 3 つ組の 最大から 目標を作る
3 つの
海外で定番の問題リスト 4 本には入っていません
問題
ゲームのtriplets でtarget とtrue、false を
- 選ぶ装備は 1 つ以上で、
同じ 装備を 2 回選ぶことは ありません - 1 つだけ
選んだ ときは、 その 装備の 値が そのまま 合成した物の値です tripletsの長さは 1 以上 100000 以下、 値は どれも 1 以上 1000 以下です
入力と出力の例
例 1
[1, 6, 2] と [4, 3, 2] を[4, 6, 2] です。[5, 6, 1] は[2, 2, 7] は
例 2
[3, 5, 2] は[3, 1, 4] だけでは、
例 3
目標と
面接での聞かれ方
面接では、
- 「3 つ組の
配列が あります。 いく つかを 選んで 要素ごとの 最大を 取ると、 目標の 3 つ組に なりますか」 - 「選ぶ数に
決まりは ありますか」と 聞くと、 「いくつでも」と 返ってくるのが ふつうです - 書き終えた
あとに 「4 つ組、 k 個組なら どうしますか」と、 広げて 聞かれる こともあります
最大を
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
素直に
段 2
最大を
段 3
捨てずに
解答
Python
Python
def can_make_target(triplets, target):
best = [0, 0, 0]
for t in triplets:
if any(
t[k] > target[k]
for k in range(3)
):
continue
for k in range(3):
best[k] = max(best[k], t[k])
return best == list(target)JavaScript
JavaScript
function canMakeTarget(
triplets, target
) {
const best = [0, 0, 0];
for (const t of triplets) {
const over = t.some(
(v, k) => v > target[k],
);
if (over) {
continue;
}
for (let k = 0; k < 3; k++) {
best[k] = Math.max(
best[k], t[k],
);
}
}
return best.every(
(v, k) => v === target[k],
);
}Go
Go
func canMakeTarget(
triplets [][]int, target []int,
) bool {
best := [3]int{}
for _, t := range triplets {
if t[0] > target[0] ||
t[1] > target[1] ||
t[2] > target[2] {
continue
}
for k := 0; k < 3; k++ {
best[k] = max(best[k], t[k])
}
}
return best[0] == target[0] &&
best[1] == target[1] &&
best[2] == target[2]
}best を 0 からbest が [0, 0, 0] のままで、false に
計算量
- 時間は O(n) です。
装備を 前から 1 回なめ、 1 つごとに 3 か所を 見るだけです - 使う
記憶は O(1) です。 持つのは 位置ごとの 最大の 3 つだけです - 位置ごとに
「目標と 同じ 値を 持つ装備が 残りに あるか」の 印を 3 つ 持つ 書き方 でも、 同じ 計算量で解けます
よく ある間違い
- 目標を
越える 装備も選ぶ。 例 1 で 全部の 装備の 最大を 取ると [5, 6, 7]になり、 目標と 食い 違って falseを返します。 越える 装備は 捨ててから 最大を取ります - 位置ごとに
別々に 「目標の 値を 持つ装備が あるか」だけを見る。 triplets = [[3, 1, 4], [3, 4, 9]]、target = [3, 4, 4]では、守りの 4 を [3, 4, 9]が持っているので 作れると 答えてしまいます。 [3, 4, 9]は速さの 9 が 目標を 越えるので 選べず、 本当は 作れません。 越えるか どうかは、 3 か所を 合わせて 装備ごとに見ます - 合計で考える。
位置ごとに 足すと、 選ぶほど 値が 大きくなり、 問題の 意味が 変わります。 合成した物の 値は最大です - 1 つの
装備で 目標と ちょうど 同じ物だけを探す。 例 1 には そういう 装備が ありませんが、 2 つを 合わせれば作れます
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「最大を
取るので、 選ぶほど値は 大きくなるだけです。 1 か所でも 目標を 越える 装備を 選ぶと 戻れないので、 そういう 装備は 捨てます。 残りは どれを 選んでも 目標を 越えないので、 全部選んだ ときの 位置ごとの 最大が 目標と 同じかを 見れば 足ります。 時間は O(n)、 記憶は O(1) です。」
書き終えたら、
「例 1 で
たどります。 [1, 6, 2]は越えないので、 最大は [1, 6, 2]です。[4, 3, 2]も越えないので、 最大は [4, 6, 2]になります。 [5, 6, 1]は攻撃の 5 が 4 を 越えるので 捨て、 [2, 2, 7]は速さの 7 が 2 を 越えるので 捨てます。 最大の [4, 6, 2]が目標と 同じなので true です。」