-
C++でASCII値の合計がk未満・k超過の単語数をカウントする方法
文字列 str(1つの文章)と整数 k が与えられます。この問題の目的は、str に含まれる単語のうち、ASCII値の合計が k 未満になる単語の数と、k より大きくなる単語の数をそれぞれ求めることです。 ASCIIとは ASCII(アスキー)とは、言語を構成する各文字に割り当てられた一意のコード番号のことです。英字・数字・記号にはそれぞれ固有の数値が対応しており、単語を構成する各文字のコード値を足し合わせることで、単語ごとの合計値を計算できます。 具体例で理解しよう 例1 入力: str = “This is ASCII”、k = 300 出力: ASCII値の合計がk未満の単語数:
-
【C++】2つの指定された要素の出現回数が等しい部分配列を数える方法
はじめに整数型の配列 arr[] と、2つの整数 A および B が与えられます。この記事のゴールは、「A の出現回数」と「B の出現回数」が等しくなるような部分配列(サブ配列)の総数を求めることです。例として、配列が [1, 2, 3]、A = 1、B = 2 である場合を考えてみましょう。このとき条件を満たす部分配列は [3]、[1, 2]、[1, 2, 3] となります。入出力の例例1入力: arr[] = { 2, 2, 1, 1, 1, 5 }、A = 1、B = 5出力: 条件を満たす部分配列の個数:4説明: 該当する部分配列は [2]、[2]、[2, 2]、[1, 5] の4つで
-
C++で全要素がKより大きい部分配列の個数を数える方法
整数型の配列 arr[] と数値 K が与えられます。このとき、すべての要素が K より大きい部分配列(サブアレイ)の総数を求めるのが目標です。例えば、配列が [1,2,3]、K=1 の場合、条件を満たす部分配列は [2]、[3]、[2,3] の3つになります。具体的な例で確認してみましょう。入力 − arr[] = { 2, 2, 1, 1, 1, 5 }; K=1出力 − 全要素がKより大きい部分配列の個数 − 4説明 − 条件を満たす部分配列は [2]、[2]、[5]、[2,2] の4つです。それぞれの部分配列に含まれる要素はすべて1より大きくなっています。入力 − arr[] = {
-
C++で0と1の個数が等しい部分配列を数える方法
0と1のみを含む配列 arr[] が与えられます。この課題のゴールは、0と1の個数が等しくなっているすべての部分配列(サブアレイ)の総数を求めることです。例えば、配列が [1,0,0] である場合、条件を満たす部分配列は [1,0] のみとなります。 具体的な例で理解していきましょう。 入力 − arr[] = { 0, 0, 1, 1, 1, 0 } 出力 − 0と1の個数が等しい部分配列の数:4 説明 − 条件を満たす部分配列は以下の通りです。 arr[0〜3] = [0,0,1,1] arr[1〜2] = [0,1] arr[4〜5] = [1,0] arr[0〜5] = [0,0,1
-
C++で隣接する要素の差が1である部分配列を数える方法
問題の概要整数を含む配列 arr[] が与えられたとき、各部分配列内で隣り合う要素同士の差がちょうど1になるような部分配列をすべて数えることが目標です。例えば、配列が [1,2,3] の場合、該当する部分配列は [1,2]、[2,3]、[1,2,3] のみとなります。具体的な例で確認してみましょう。入力例 1arr[] = { 4, 3, 2, 1 }出力 − 隣接要素の差が1である部分配列の個数 − 6解説 − 該当する部分配列は以下の通りです。[4,3], [3,2], [2,1], [4,3,2], [3,2,1], [4,3,2,1]合計 6 個入力例 2arr[] = { 1, 5,
-
C++で元の配列と同じ異なる要素数を持つ部分配列を数える方法
整数を含む配列 arr[] が与えられたとき、各部分配列に含まれる「異なる要素の種類数」が、元の配列全体の異なる要素の種類数と一致するような部分配列をすべて数えるのが本記事の目的です。例えば、元の配列が [1,1,2,3] の場合、条件を満たす部分配列は [1,2,3] と [1,1,2,3] の2つになります。元の配列の異なる要素数は3であり、これらの部分配列の異なる要素数もそれぞれ3だからです。それでは、具体的な例で確認してみましょう。入力例と出力例例1入力 − arr[] = {1,2,1,2,3,4,2}出力 − 元の配列と同じ異なる要素数を持つ部分配列の数:6説明 − arr[] の
-
C++でバイナリ配列内の0のみ・1のみからなる部分配列を数える方法
0と1のみで構成される配列 arr[] が与えられたとき、各部分配列が「0のみ」または「1のみ」を含むような部分配列の総数を求めるのが本記事の目的です。 例えば、配列が [1,0,0] の場合、部分配列は以下のようになります。 0のみを含む部分配列:[0]、[0]、[0,0] 1のみを含む部分配列:[1] 具体例で理解しよう 入力: arr[] = { 0, 0, 1, 1, 1, 0 } 出力: 0のみを含む部分配列の数: 4 1のみを含む部分配列の数: 6 解説: 各部分配列は以下の通りです。 0のみの場合: [0], [0], [0], [0,0] の計4つ ( arr[0], ar
-
C++でX以下の要素のみを含む部分配列の個数を求める方法
整数型の配列 arr[] と変数 X が与えられたとき、「各部分配列(サブ配列)が X 以下の要素のみで構成されている」という条件を満たす部分配列をすべて数えるのが本記事の目的です。例えば、配列が [1,2,3] で X=2 の場合、条件を満たす部分配列は [1]、[2]、[1,2] の3つになります。具体例で理解する入力 − arr[] = { 4,3,2,1,6 }; X=3出力 − X 以下の要素を持つ部分配列の個数 − 6説明 − 条件を満たす部分配列は以下の通りです。[3], [2], [1], [3,2], [2,1], [3,2,1]入力 − arr[] = { 3,6,2,7,
-
C++で文字列内の特殊な回文を数える方法
問題の概要文字列 str が与えられたとき、str の部分文字列の中から「特殊な回文」に該当するものをすべて数えることを考えます。ここで特殊な回文とは、長さが1より大きく、すべての文字が同一であるか、あるいは中央の文字だけが異なる文字列のことです。例えば、文字列が baabaa の場合、元の文字列の部分文字列となっている特殊な回文は aa、aabaa、aba、aa となります。具体例で確認してみましょう。例1入力: str = abccdcdf出力: 文字列内の特殊な回文の数 − 3説明: 特殊な回文となる部分文字列は cc、cdc、dcd です。例2入力: str = baabaab出力:
-
C++で行列内のすべての要素が同一である行の数を数える方法
整数で構成される行列が与えられたとき、すべての要素が同一である行が何行あるかを求めるのが、この記事のテーマです。例として、次のような 4×5 の行列を考えてみましょう。15131111115323577777この場合の答えは 2 です。1行目(すべてが 1)と3行目(すべてが 7)は、同一の要素のみで構成されているためです。それでは、具体的な例で確認していきましょう。入出力の例例1入力:matrix = [ 1 1 1 1 ] [ 2 3 2 7 ] [ 3 3 3 3 ]出力: 同一要素で構成される行の数 − 2説明: 0行目はすべて 1、2行目はすべて 3 で構成さ
-
C++で整数Nの回転のうち奇数・偶数になるものをカウントする方法
問題の概要整数Nが与えられます。この記事のゴールは、Nを回転(ローテート)させたときに奇数になる回転の個数と偶数になる回転の個数を、それぞれ数えることです。例えば、Nが123の場合、その回転は「123」「321」「132」の3通りになります。このうち奇数になるのは123と321の2個、偶数になるのは132の1個です。具体的な入出力例で確認してみましょう。入力例1入力: N = 54762出力:奇数になる回転の個数:2偶数になる回転の個数:3解説: 回転によって生成される数は以下の5つです。54762、25476、62547、76254、47625偶数になる回転(3個):54762、25476、
-
C++でソート・回転済み連結リストの回転数を求める方法
問題概要ある連結リストが与えられます。このリストは、最初に昇順にソートされ、その後 K 個のノード分だけ回転(ローテーション)されたものです。この記事の目的は、元のリストに対する回転数 K を求めることです。たとえば、以下のような連結リストが入力として与えられたとします。5 → 7 → 9 → 1 → 3このリストは、元のソート済みリスト1 → 3 → 5 → 7 → 9を 2 ノード分だけ回転したものになっています。つまり、この場合の K は 2 です。具体例で理解する例 1入力: リスト: 5 → 7 → 9 → 1 → 3出力:連結リストの要素: 5 7 9 1 3ソート・回転済み連結リ
-
C++で4で割り切れる回転の個数を効率的に数える方法
はじめにこの記事では、大きな整数が与えられたとき、その回転(ローテーション)の中で4で割り切れるものがいくつあるかを数える方法を解説します。回転操作を実際に何度も繰り返して数値を組み立てるのは非効率です。そこで、4の倍数に関する重要な性質を利用します。それは「整数の下2桁が4で割り切れるならば、その整数全体も4で割り切れる」という性質です。例えば、1234の回転は1234、4123、3412、2341の4通りありますが、このうち3412は下2桁が「12」であり、12は4で割り切れるため、3412全体も4で割り切れます。入出力例入力 − num = 15324出力 − 4で割り切れる回転の個数:
-
C++で8で割り切れる回転の個数を数える方法
大きな整数が与えられます。目的は、その数 num を回転(ローテーション)させた結果のうち、8で割り切れるものの個数を数えることです。 回転を何度も繰り返して毎回割り算を実行するのは非効率です。そこで、8の倍数に関する性質を利用します。整数の下3桁が8で割り切れるならば、その数全体も8で割り切れるという性質です。例えば 1800 の場合、回転は 1800、0180、0018、8001 となり、このうち 8 で割り切れるのは 1800 のみです。 具体例で確認してみましょう。 入力 − num = 15320 出力 − 8で割り切れる回転数: 1 説明 − 回転は以下の通りです。 15320,
-
C++で数字列の可能なデコード数を求める方法
問題の概要 数字の並びを表す文字列が与えられます。各数字は1から26までの英字アルファベットに対応してデコードされます。つまり、1は「A」、2は「B」、…、26は「Z」という対応関係です。この記事の目的は、与えられた数字列から作り出せるすべてのデコードの組み合わせの数を求めることです。 例えば、数字列が「123」の場合、可能なデコードは「ABC」(1-2-3)、「LC」(12-3)、「AW」(1-23) の3通りとなり、答えは3になります。 例で理解しましょう 入力 − str[]=1532 出力 − 与えられた数字列の可能なデコードの数 − 2 説明 − 可能なデコードは AECB (1-5
-
C++で指定サイズの長方形内に作成できる菱形の個数を数える方法
問題の概要 高さ×幅の寸法をもつ長方形が与えられます。この長方形は2次元座標系上に配置されており、左下の頂点が原点 (0,0) に位置します。今回の目的は、次のすべての条件を満たす菱形がこの長方形内にいくつ作れるかを数えることです。 菱形の面積が0より大きいこと。 菱形の対角線がx軸およびy軸に平行であること。 菱形のすべての頂点が整数座標を持つこと。 入出力例 入力:縦=3、横=3 出力:指定サイズの長方形内に作れる菱形の個数:4 説明:下の図は縦3×横3の長方形です。面積が0より大きく、対角線が両軸に平行で、頂点が整数座標である菱形が4つ存在します。 1つ目 [ (1,0), (2,1
-
C++で0を桁に含む最大d桁の正の整数の個数を求める方法
問題概要桁数を表す整数 d が与えられます。このとき、「0」を少なくとも1つ桁に含み、最大 d 桁となる正の整数の個数を求めるのが目標です。つまり、1桁、2桁、3桁……d桁の正の整数の中から、0 を少なくとも1つ含むものをすべて数え上げます。d桁の数の数え方まず、d 桁の数のうち少なくとも1つの 0 を含むものの個数を求めてみましょう。例として d=3 の場合を考えます。少なくとも1つの 0 を含む3桁の数を作るには、次のような組み合わせが考えられます。d1(百の位)に入る数字は 1〜9 :9通り d2(十の位)に入る数字は 0〜9 :10通り d3(一の位)に入る数字は 0〜9 :10通り
-
C++で1からkまでのすべての数を作るために追加すべき数の個数を求めるプログラム
問題概要 数値のリスト nums と整数 k が与えられます。nums の部分集合を選んで合計することで、1 から k までの任意の整数をすべて作れるようにしたいと考えます。そのために nums に新たに挿入する必要がある数の最小個数を求めてください。 たとえば、入力が nums = [3, 5]、k = 6 の場合、出力は 2 になります。「1」と「2」を挿入すればよいからです。実際、各値は次のように作成できます。 1 = [1] 2 = [2] 3 = [3] 4 = [1, 3] 5 = [5] 6 = [1, 5] 解き方(貪欲法) この問題は貪欲法で効率的に解けます。ポイントは
-
C++で2つの数を加算する際に必要な繰り上がり操作の回数を数える方法
2つの数値 num_1 と num_2 が与えられます。目的は、これらの数を加算する際に必要な繰り上がり(キャリー)操作の回数を数えることです。例えば、123 と 157 を加算する場合、繰り上がり操作は1回発生します(7+3=10、1+2+5=8、1+1=2)。具体例を使って理解していきましょう。入力 − num_1=432、num_2=638出力 − 2つの数を加算する際に必要な繰り上がり操作の回数:2説明 − 右から左へ各桁を足し合わせながら、繰り上がりを数えます。(2+8=10、繰り上がり1)count=1、(1+3+3=7、繰り上がり0)count=1、(4+6=10、繰り上がり1)
-
C++で「積が和で割り切れる」1からNまでの数値ペアを数える方法
整数 N が与えられたとき、1 から N までの数値の中から、2 つの数の積がその和で割り切れるようなペア (i, j) の個数を求めるのがこの記事の目標です。 例で理解しよう 入力 − N = 11 出力 − 条件を満たすペアの数:1 説明 − 3 と 6 のペアに注目すると、積は 18、和は 9 であり、9 は 18 を余りなく割り切ることができます。N = 11 の範囲内ではこれが唯一のペアです。 入力 − N = 30 出力 − 条件を満たすペアの数:12 説明 − 該当するペアは次の 12 個です。 (3, 6)、(4, 12)、(5, 20)、(6, 12)、(6, 30)、(8,