C++で配列内から指定した合計値になるトリプレット(3つの要素)を見つける方法
このチュートリアルでは、配列の中から合計が指定された値と一致する3つの要素(トリプレット)を見つけるプログラムをC++で作成します。
解き方の手順
以下のステップで問題を解いていきます。
テスト用のダミーデータを含む配列を作成します。
3つの要素を走査するため、三重のネストされたループを記述します。各ループは配列の末尾まで繰り返します。
選んだ3つの要素を加算します。
その合計を指定された値と比較します。
両者が一致した場合、該当する要素を出力してループを抜けます。
実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
bool findTriplet(int arr[], int arr_size, int sum) {
for (int i = 0; i < arr_size - 2; i++) {
for (int j = i + 1; j < arr_size - 1; j++) {
for (int k = j + 1; k < arr_size; k++) {
if (arr[i] + arr[j] + arr[k] == sum) {
cout << arr[i] << " " << arr[j] << " " << arr[k] << endl;
return true;
}
}
}
}
return false;
}
int main() {
int arr[] = { 1, 2, 3, 4, 5, 6, 7 };
findTriplet(arr, 7, 12);
return 0;
}
出力
上記のプログラムを実行すると、次のような結果が得られます。
1 4 7
計算量に関する補足
このアプローチでは三重ループを使用しているため、時間計算量はO(n³)になります。配列サイズが大きくなると処理に時間がかかる点に注意してください。より効率的な解法としては、ソート後にツーポインタ法を組み合わせる、あるいはハッシュセットを活用する方法があり、これらにより計算量をO(n²)まで改善できます。
まとめ
この記事では、ブルートフォース(全探索)によるシンプルな実装で、配列内から合計が指定値と一致するトリプレットを見つける方法を学びました。本チュートリアルについて質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で「x + 桁の合計 = n」を満たす数xを見つける方法
この記事では、ある整数 n が与えられたとき、「x + x の各桁の合計 = n」という条件を満たす数 x を求める問題を解説します。例として、n = 21 の場合を考えてみましょう。このとき答えは x = 15 となります。なぜなら、15 の各桁の合計は 1 + 5 = 6 であり、15 + 6 = 21 となって、与えられた n と一致するからです。解き方のアプローチこの問題はシンプルな方法で解くことができます。1 から n まで順番に数を調べていき、それぞれの数について「その数自身 + 各桁の合計」が n と等しくなるかどうかを確認します。条件を満たす数が見つかった時点で処理を終了し、そ
-
C++で指定された合計値となるすべての一意なトリプレットを見つける方法
今回は、配列の中から3つの要素を選び、その合計が指定された値と一致する「トリプレット(三つ組)」をすべて見つけるという、興味深い問題を解説します。問題の概要いくつかの要素を含む配列と、目標となる合計値が与えられます。この中から合計が指定値と等しくなる3つの要素の組み合わせをすべて抽出するのがタスクです。例えば、配列が {4, 8, 63, 21, 24, 3, 6, 1, 0} で、合計値 S = 27 が与えられた場合、条件を満たすトリプレットは {0, 3, 24}、{0, 6, 21}、{1, 5, 21} となります。条件を満たす組み合わせが複数存在する場合は、それらをすべて出力します