-
C++で同じ配列内に平均値が存在するペアを数える方法
問題の概要 各要素が[-1000, 1000]の範囲に収まる整数型配列が与えられます。求めるのは、「2つの要素の平均値が同じ配列内にも存在する」ようなペアの総数です。 例えば、arr[] = [1, 2, 3, 4] の場合を考えてみましょう。1と3の平均は2、2と4の平均は3であり、2も3も配列内に存在するため、該当するペアは (1, 3) と (2, 4) の2つとなり、答えは 2 になります。 入出力例 入力: arr[] = { -1, 2, 5, -3, 8, 10 } 出力: 同じ配列内に平均値が存在するペアの数: 2 説明: 平均値がarr[]内に存在するペアは (-1, 5)(
-
C++で指定した値と等しいGCD(最大公約数)を持つ自然数のペアを数える方法
この記事では、3つの入力変数「start(開始値)」「end(終了値)」「number(指定値)」が与えられたとき、startからendの範囲内にあり、かつGCD(最大公約数)が「number」と等しい数のペアを求める方法を解説します。つまり、GCD(A, B) = number を満たし、AとBがどちらも範囲 [start, end] 内に含まれるようなペア (A, B) の個数をカウントします。具体例で確認してみましょう。入力 − start=5, end=20, number=8出力 − GCDが指定値と等しい自然数のペアの個数 − 3説明 − 5から20の範囲でGCDが8となるペアは
-
C++で通過する車のペアを数える方法
長さNの配列が与えられ、その中には0と1のみが含まれています。値1は西方向へ進む車を、値0は東方向へ進む車を表します。車Aと車Bのペアが 0 <= A < B < N の条件を満たし、Aが東方向へ、Bが西方向へ進んでいる場合、そのペアを「通過する車」として1つとカウントします。つまり、0のインデックスが1のインデックスより小さい (0, 1) のペアを数えることになります。具体例で確認しましょう。入力 − arr[] = {1, 0, 1, 0, 1}出力 − 通過する車のペア数: 3説明 − 0のインデックスが1のインデックスより小さい (0, 1) のペアは、(arr[1], arr[2]
-
C++でマンハッタン距離と等しい距離を持つパスの数を求める方法
2次元座標系上の2つの点 (x1, y1) と (x2, y2) を表す変数 x1、x2、y1、y2 が与えられます。この記事の目的は、これら2点間のマンハッタン距離と等しい距離を持つすべてのパスの総数を求めることです。 マンハッタン距離とは 2点 (x1, y1) と (x2, y2) の間のマンハッタン距離は、次の式で定義されます。 MD = |x1 − x2| + |y1 − y2| ここで、A = |x1 − x2|、B = |y1 − y2| とおきます。 マンハッタン距離と等しい距離を持つすべてのパスは、合計 (A + B) 本の移動で構成されます。そのうち A 本が水平方向の移動
-
C++で文章中の回文単語を数える方法を解説
英文の文章を表す文字列が与えられます。この記事では、その文章に含まれる回文(パリンドローム)の単語の数を求める方法を解説します。回文とは、先頭から読んでも末尾から読んでも同じ文字並びになる単語のことです。例えば、文章が「Madam speaks good Malayalam」であれば、回文の単語は2つ(Madam と Malayalam)になります。注意 − 単語には大文字と小文字が混在している場合があります。それでは、具体的な例で確認していきましょう。入力 − str = My Mom and Anna left at Noon;出力 − 文中の回文単語の数 − 3説明 − この文章における
-
C++で数列中に現れる連続する0のペアを数える方法
問題の概要1から始まる数列生成器を考えます。各ステップで「0」は「10」へ、「1」は「01」へと変換されます。そのため、ステップが進むごとに数列は以下のように変化していきます。ステップ1: 01ステップ2: 1001ステップ3: 01101001 ……この記事の目的は、与えられたステップ数における連続する2つの0(00)のペアの出現回数を求めることです。例えば、ステップ1では連続する0のペアは0個、ステップ2では1個、ステップ3でも1個となります。ステップ4: 1001011001101001ステップ5: 01101001100101101001011001101001数列の規則性数列を観察す
-
C++で条件 i*arr[i] > j*arr[j] を満たす配列内のペアの個数を数える方法
数値からなる配列が与えられたとき、次の条件を満たす要素のペアを見つけるのが目標です。条件: (i × arr[i]) > (j × arr[j]) が成り立つ場合、(arr[i], arr[j]) は有効なペアとみなされます。例えば、配列が [5, 4, 3, 2, 1] の場合、有効なペアは [3, 1] と [2, 1] の2つになります。例で理解する入力: arr[] = [1, 5, 4, 1, 2, 8, 3]出力: 条件 i*arr[i] > j*arr[j] を満たすペアの個数 ― 3説明: 有効なペアは (5, 1)、(4, 1)、(8, 3) の3つです。入力:
-
C++でLCM(arr[i], arr[j]) > min(arr[i], arr[j])を満たす配列内のペアを数える方法
この記事では、正の整数からなる配列が与えられたとき、LCM(arr[i], arr[j]) > min(arr[i], arr[j]) という条件を満たす要素ペアの個数を求める方法を解説します。つまり、ペアを構成する2つの要素の最小公倍数(LCM)が、そのうち小さい方の値より大きくなるようなペアを数えます。注意: ペア (arr[i], arr[j]) と (arr[j], arr[i]) は同一のものとみなし、二重にカウントしてはいけません。具体例で理解しよう例1入力: arr[] = [1, 5, 4, 2]出力: 条件を満たすペアの数 ― 6説明: 合計6つのペアが条件を満たします
-
【C++】少なくとも1つの要素が素数である配列内のペアの個数を数える方法
問題の概要 正の整数からなる配列が与えられます。この問題の目的は、「少なくとも1つの要素が素数である」異なる要素同士のペアの個数を求めることです。 例えば、配列が [1, 2, 3, 4] の場合、考えられるすべてのペアは (1,2)、(1,3)、(1,4)、(2,3)、(2,4)、(3,4) の6つですが、そのうち少なくとも一方が素数であるのは (1,2)、(1,3)、(2,3)、(2,4)、(3,4) の5つです(1 と 4 は素数ではないため、(1,4) は対象外になります)。 入出力例 入力 − arr[] = { 1, 2, 4, 8, 10 } 出力 − 少なくとも1つの要素が素
-
C++で合計が指定値xに等しくなる2つのソート済み配列のペアを数える方法
本記事では、正の整数を含む2つの配列と値 x が与えられたとき、1つ目の配列から要素 A、2つ目の配列から要素 B を選び、A + B = x となるペア (A, B) の個数を求める問題を扱います。具体的な例で確認してみましょう。入力例1arr_1[] = {1, 2, 5, 3, 4}、arr_2[] = {7, 0, 1, 3}、x = 6出力例1合計が x に等しいペアの個数:2説明: 条件を満たすペアは (5, 1)(arr_1[2] と arr_2[2])および (3, 3)(arr_1[3] と arr_2[3])です。入力例2arr_1[] = {1, 1, 1}、arr_2[
-
【C++】2つの配列から剰余演算の結果がKになるペアを数える方法
問題の概要正の整数からなる2つの配列と値 K が与えられます。目的は、(A, B) という形のペアのうち、A % B = K または B % A = K を満たすものを見つけることです。ここで A は最初の配列の要素、B は2番目の配列の要素に対応し、重複のない一意なペアの総数を求めます。具体例で確認してみましょう。入力 − arr_1[] = {1,2,5,3,4}; arr_2[] = {7,1,3}; k=2出力 − 剰余演算の結果が K となる2つの配列間のペアの数 − 2説明 − 該当するペアは (5,7)、つまり (arr_1[2], arr_2[1]) で 7%5=2、および (
-
C++で2つのBSTから合計が指定値xと等しいペアを数える方法
2つの二分探索木(BST)と整数値 x が与えられます。この記事の目的は、BST_1 から1つのノード、BST_2 からもう1つのノードを選んだペアのうち、両ノードの値の合計が x に一致するものの個数を求めることです。具体的には、BST_1 のノードと BST_2 のノードのデータ部分を加算し、その合計が x と等しければカウントを1つ増やしていきます。具体例で確認してみましょう。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 1説明 − 該当するペアは (8, 6) です。入力出力 − 合計が指定値 x に等しい2つのBSTからのペアの数 − 2説明 − 該当するペ
-
【C++】整数Nを0に減らすまでに必要な操作回数を求める方法
問題概要正の整数 N が与えられます。このとき、N を 0 に減らすまでに必要な操作回数を求めるのが目標です。ここで行う操作は「N = N − P」というもので、P はその時点における N の最小の素因数を意味します。入出力例入力: N = 17出力: N を 0 に減らすのに必要な操作回数: 1説明: 17 は素数なので、最小の素因数は 17 自身です。したがって操作は 1 回だけ行われ、17 − 17 = 0 となります。入力: N = 20出力: N を 0 に減らすのに必要な操作回数: 10説明: 20 の最小の素因数は 2 です。2 を繰り返し引いていくと、次のように値が減っていきま
-
C++で異なる要素の数が最大となる部分列の個数を求める方法
整数のみを含む配列 arr[] が与えられます。この問題の目的は、「異なる要素(ユニークな要素)の数が最大になる」ような配列 arr[] の部分列が全部で何通りあるかを求めることです。例えば、配列が [4, 1, 2, 3, 4] の場合、条件を満たす部分列は [4, 1, 2, 3] と [1, 2, 3, 4] の2つになります。入力例と出力例で理解する入力 − arr[] = { 1, 3, 5, 4, 2, 3, 1 }出力 − 異なる要素が最大となる部分列の個数 − 4説明 − 異なる要素は 1、2、3、4、5 の5種類です。条件を満たす部分列は次の4通りになります。[ 1, 3,
-
C++でi < jとなる一意なペア(arr[i], arr[j])の個数を求める方法
問題概要 整数要素を含む配列が与えられたとき、ペア (arr[i], arr[j]) のインデックスが i < j を満たすような、一意なペアの個数を求めるのが本記事のゴールです。 具体例を使って理解していきましょう。 入力 − arr[] = {1,2,3}; 出力 − i < j を満たす一意なペア (arr[i], arr[j]) の個数 − 3 説明 − すべての要素が一意であるため、ペアは以下のようになります。 (1,2) - ( arr[0],arr[1] ) 0<1 (1,3) - ( arr[0], arr[2] ) 0<2 (2,3) - ( arr[
-
C++で(n XOR x)=(n − x)を満たすx≤nの値の個数を求める方法
問題概要整数 n が入力として与えられます。このとき、条件 (n XOR x) = (n − x) を満たす値 x のうち、x が範囲 [0, n] に含まれるものの個数を求めるのが目標です。入出力例入力 − n = 10出力 − (n XOR x) = (n − x) を満たす x ≤ n の値の個数 − 4説明 − 10 xor x = 10 − x を満たす x の値は、0、2、8、10 の 4 つです。入力 − n = 15出力 − (n XOR x) = (n − x) を満たす x ≤ n の値の個数 − 16説明 − 15 xor x = 15 − x を満たす x の値は、0
-
C++で最大要素がkより大きい部分配列の数を求める方法
問題概要整数要素を含む配列 arr[] と変数 k が与えられます。求めるのは、最大要素が k より大きい部分配列の個数です。たとえば、配列が [1,2,3]、k が 1 の場合、考えられる部分配列は [1], [2], [3], [1,2], [2,3], [1,2,3] の6つです。このうち最大要素が 1 より大きいのは [2], [3], [1,2], [2,3], [1,2,3] の5つなので、答えは 5 となります。入出力例例1入力: arr[] = {1,2,5,3}, k = 3出力: 最大要素が k より大きい部分配列の数: 6説明: すべての部分配列は [1], [2], [
-
C++で集合{'a','b','c'}のすべての文字を同時に含まない部分文字列の個数を求める方法
文字列 str[] が与えられ、この文字列は a、b、c の3種類の文字のみで構成されているとします。ここでの目的は、3つの文字すべてを同時に含まない部分文字列の個数を求めることです。例えば、a、b、c、abb、bba、bc、ca、ccc といった部分文字列は有効ですが、abc、bcca、cab は a、b、c のすべてを含んでいるため対象外となります。具体例で確認してみましょう。入力: str[] = aabc出力: 集合 {a, b, c} のすべての文字を同時に含まない部分文字列の個数は 8説明: 対象となる部分文字列は a, a, b, c, aa, ab, bc, aab の8つです
-
C++で特定の文字Xを1回以上含む部分文字列の個数を求める方法
問題の概要文字列 str と特定の文字 X が与えられます。求めたいのは、文字 X を少なくとも1回含む部分文字列(substring)の総数です。たとえば str = abc、X = a の場合、条件を満たす部分文字列は「a」「ab」「abc」の3つなので、答えは 3 になります。入出力例例1入力: str = aabccd、X = c出力: 条件を満たす部分文字列の数 = 14解説: c を1つ以上含む部分文字列は、次の14個です。c、c、bc、cc、cd、abc、bcc、ccd、aabc、abcc、bccd、aabcc、abccd、aabccd例2入力: str = settings、X
-
【C++】文字列から作成可能な長さnの部分文字列の個数を求める方法
文字列str[]と整数nが与えられたとき、str[]から取り出すことのできる「長さnの部分文字列」が全部でいくつあるかを求めるのがこの問題の狙いです。例えば、文字列が「abcde」でn=3の場合、長さ3の部分文字列は「abc」「bcd」「cde」の3つとなり、個数は3になります。 具体例で理解する 入力: str[] = computer、n = 4 出力: 与えられた文字列から作成可能な長さnの部分文字列の個数は 5 解説: 長さ4の部分文字列は「comp」「ompu」「mput」「pute」「uter」の5つです。 入力: str[] = development、n = 5 出力: 与えら