-
C++でN個の整数の配列からK個の数を選んで加算し、生成できるすべての異なる整数を出力する方法
問題の概要この問題では、N個の整数からなる配列と数値Kが与えられます。求められているのは、配列から任意のK個の要素を選んで加算することで生成できる、すべての異なる整数を出力することです。なお、同じ要素を複数回(最大K回まで)選んでも構いません。入出力例入力:array = {2, 5, 13, 9}、K = 2 出力:4, 7, 10, 11, 14, 15, 18, 22, 26この例では、2つの要素を加算した結果は以下のようになります。2+2=4、2+5=7、2+13=15、2+9=11、5+5=10、5+13=18、5+9=14、13+13=26、13+9=22、9+9=18重複する値(
-
【C++】整数配列から重複を除いた一意の要素を出力する3つの方法
問題概要 この記事では、整数値の配列が与えられたときに、その配列に含まれる重複しない(一意の)要素だけを出力する方法を解説します。出力には、同じ値が何度現れても1度だけ含まれるようにします。 入出力例 Input: array = {1, 5, 7, 12, 1, 6, 10, 7, 5} Output: 1 5 7 12 6 10 上記の例では、1・5・7 がそれぞれ2回ずつ現れていますが、出力ではそれぞれ1度だけ表示されています。 方法1: 二重ループで重複をチェックする 最もシンプルなアプローチは、各要素についてそれ以前の要素と比較し、初めて登場した要素のみを出力する方法です。外側
-
C++で長さMのすべての異なる循環文字列を辞書順に出力する方法
この問題では、文字列と整数Mが与えられます。求められているのは、その文字列から生成できる長さMのすべての異なる循環文字列を、辞書順(アルファベット順)で出力することです。問題の例具体例を使って問題を理解しましょう。入力: str = ssssn, M = 3 出力: nss sns ssn sss説明 − 長さ3の循環文字列として生成できるのは「sss」「sss」「ssn」「sns」「nss」の5つです。ここから重複を除き、辞書順に並べ替えると「sss ssn sns nss」が答えとなります。解決策のアプローチこの問題を解くには、以下の手順に従います。まず、元の文字列を2回連結した文字列(s
-
【C++】文字列内のすべての異なる文字を出現順に出力する方法
問題概要この問題では、1つの文字列が与えられます。求められているのは、その文字列に含まれるすべての異なる文字(重複していない文字)を、元の文字列での出現順に従って出力することです。具体例を使って問題を確認してみましょう。入力: tutorials Point出力: uralsPn「t」や「o」、「i」などは複数回出現するため除外され、1度だけ登場する文字だけが出現順に表示されていることがわかります。解法のアプローチこの問題には複数の解き方があります。最も単純なのは二重ループ(ネストされたループ)を使う方法ですが、計算量がO(n²)となり、文字列が長くなると非効率です。そこで本記事では、より効率
-
C++で指定した合計点を作る1・2・3のポイント組み合わせをすべて出力する方法
この記事では、与えられた合計得点 n に対して、バスケットボールの得点である 1、2、3 の組み合わせの中から、合計がちょうど n になるすべてのパターンを出力する方法を解説します。問題の概要まず、具体例を見ながら問題を理解しましょう。入力: 4 出力: 1 1 1 1 1 1 2 1 2 1 1 3 2 1 1 2 2 3 1このように、合計が4になる1・2・3の並び順を含むすべての組み合わせ(順列)が出力されます。順序が異なるものは別の組み合わせとして扱う点に注意してください。解決のアプローチ:再帰を活用この問題は再帰(recursion)を使うことでシンプルに解けます。基本的な考え方は以
-
C++で整数の約数のすべての組み合わせを出力する方法
問題概要 この記事では、整数 n が与えられたとき、その約数(因子)を掛け合わせて n になるすべての組み合わせを出力する方法を解説します。 まず、具体例を見て理解を深めましょう。 入力: 24 出力: 2 2 2 3 2 4 3 8 3 4 6 2 12 この例では、24 を複数の約数の積として表現できるパターンがすべて列挙されています。 解決アプローチ:再帰とバックトラッキング この問題は、再帰関数を使って約数の組み合わせを順番に生成することで解決できます。見つかったすべての組み合わせは、2次元の vector(vector の vector)に格納していきます。 アルゴリズムの流れは以
-
C++でバランスの取れた括弧の組み合わせをすべて出力する方法
この記事では、整数 n が与えられたときに、n組のバランスの取れた括弧のすべての組み合わせを出力する問題をC++で解く方法を解説します。 バランスの取れた括弧とは? バランスの取れた括弧とは、すべての開き括弧「{」に対して対応する閉じ括弧「}」が存在し、かつ括弧が正しく入れ子(ネスト)になっている文字列のことです。例えば「{{}}」はバランスが取れていますが、「}{{」のように対応関係が崩れている文字列は不正となります。 問題例 具体例を見てみましょう。 入力:n = 2 出力:{}{} {{}} 解法のアプローチ この問題を解くには、開き括弧と閉じ括弧の数を常に追跡しながら、再帰的に文字列を
-
C++で大きな数値に含まれる3桁の繰り返し数列をすべて検出・表示する方法
この問題では、1つの数値が与えられ、その中に出現する3桁の繰り返し数列をすべて出力することが求められます。 まず、例を見て問題を理解しましょう。 入力: 98769876598765 出力: 987: 3回 876: 3回 765: 2回 この問題を解くには、非常に大きな数値を文字列として格納して扱います。数値の各桁は文字として処理されます。まず最初の3桁をチェックし、その後、インデックス3から末尾まで順に走査しながら、スライドウィンドウ方式で新たな3桁の数を取得していきます。各3桁の数の出現頻度をカウントし、最後に頻度が1を超える(2回以上出現する)3桁の数をすべて
-
C++で文字列を波状パターンで出力する方法
問題の概要この記事では、文字列と整数 n が与えられたとき、その文字列を n 行の波状パターン(ウェーブパターン)として出力する方法を解説します。まず、具体例を使って問題を理解しましょう。入力: Tutorial n = 3 出力: T r U o i s t l波状パターンの仕組み波状パターンは、文字列の各文字を1つずつ出力しながら、出力位置を1行ずつ下へ移動させていくことで描画されます。n 行目に到達したら移動方向を反転させて1行ずつ上へ戻り、文字列の文字がなくなるまでこの動きを繰り返します。結果として、文字がジグ
-
C++でループを使わずに数値パターンを出力する方法(再帰の活用)
この問題では、数値 n が与えられます。n から始めて 5 ずつ値を減算しながら 0 または負の値に達するまで出力し、その後再び元の数値まで増加させながら出力するパターンを作成します。まず、具体例で問題を確認してみましょう。入力: n = 12 出力: 12 7 2 -3 2 7 12解決アプローチこの問題は再帰(リカージョン)を使うことで解決できます。for 文や while 文などのループを使用せず、関数が自分自身を呼び出す仕組みを利用して、値の減少と増加の両方の処理を実現します。再帰の流れは以下の通りです。値が正の間は、現在の値を出力し、5 を引いた値で自分自身を再帰的に呼び出します。値
-
C++で解く:すべての桁が一意(重複なし)となる、n未満の最大の数を出力するアルゴリズム
問題概要この問題では、整数 n が与えられます。求めるのは、「n より厳密に小さい数のうち、すべての桁が互いに異なる(重複がない)最大の数」です。具体例を使って問題を理解しましょう。入力: n = 2332 出力: 23192332 未満の数の中で、桁の重複がない最大の数は 2319 となります。解法のアプローチこの問題は、以下のようなシンプルな戦略で解くことができます。n − 1 から 0 へ逆順にカウントダウンしていきます。各数値について各桁の出現回数を記録し、すべての桁が一度しか現れていないかどうかを判定します。条件を満たす数値が見つかった時点でそれを出力してループを終了します。条件を満
-
C++で数字根がDとなるK桁の数値を出力する方法
この問題では、2つの整数KとDが与えられ、K桁の数値のうち、その数字根(デジタルルート)がDと等しくなるものを出力することが求められます。数字根とは、数値を構成する各桁の数字を再帰的に加算していき、1桁の数になるまでこの操作を繰り返した結果得られる1桁の値のことです。「デジタルサム(数字和)」とも呼ばれます。具体例で問題を確認しましょう。入力: D = 5, K = 6 出力: 500000解法のアプローチこの問題は、数値Dの後ろに0を並べるというシンプルな発想で解決できます。つまり、出力する数値は {D000...(0がK-1個)} の形になります。0をいくつ追加しても各桁の数字の合計は変わ
-
C++で行列を逆波形(リバースウェーブ)形式で出力する方法
この問題では、行列が与えられ、その行列を逆波形(リバースウェーブ)の順序で1行に出力することが求められます。問題の概要具体例を使って問題を確認してみましょう。入力: 1 4 6 11 2 5 8 54 7 9 3 43 1 7 4 34出力: 11 54 43 34 4 3 8 6 4 5 9 7 1 7 2 1この問題を解くには、行列を逆波形の順序で走査する必要があります。具体的には、まず最後の列の要素を上から下へ出力し、次に後ろから2番目の列の要素を下から上へ出力します。この上下交互の走査を、行列の最初の列に到達するまで繰り返していきます。アルゴリズムのポイント列を
-
C++で行列を左右交互(ジグザグ順)に出力する方法
問題の概要この記事では、2次元配列(行列)が与えられたとき、1行目は左から右へ、2行目は右から左へ、3行目は再び左から右へ…というように、行ごとに方向を交互に切り替えながらすべての要素を出力する方法を解説します。このような出力形式は「ジグザグ順」や「蛇行順」とも呼ばれます。例で理解する入力: array = { {2, 5} {4, 9} } 出力: 2 5 9 41行目の「2, 5」は左から右へそのまま出力され、2行目の「4, 9」は右から左へ逆順に出力されるため、結果は「2 5 9 4」となります。解決のアプローチこの問題は、以下の手順で解くことができます。各行について、現
-
C++で指定した点から始まる螺旋形式の行列出力アルゴリズム
問題概要この問題では、2次元行列と1つの点 P(c, r) が与えられます。求められているのは、指定された点 P を起点として、行列のすべての要素を反時計回りの螺旋(スパイラル)形式で出力することです。問題の例具体例を見ながら、問題を理解しましょう。入力: matrix[][] = {{1, 4, 7}, {2, 5, 8}, {3, 6, 9}} 開始点: P(2, 0) ※(列, 行) 出力: 7 8 5 4 9 6 3 2 1開始点の要素「7」から始まり、反時計回りに「8 → 5 → 4 → 9 → 6 → 3 → 2 → 1」の
-
C++で指定された行列をジグザグ形式で出力する方法
この記事では、2次元行列が与えられたときに、その要素をジグザグ(波状)形式で出力する方法を解説します。 まず、具体例を見て問題の内容を確認しましょう。 入力: 12 99 43 10 82 50 15 75 5 出力: 12 99 43 50 82 10 15 75 5 ご覧のとおり、ジグザグ形式とは「0行目は左から右へ、1行目は右から左へ、2行目は再び左から右へ…」というように、行ごとに出力する方向を交互に切り替える方式のことです。 解決のアプロー
-
C++で与えられた2次元行列を逆スパイラル形式で出力する方法
この記事では、2次元行列が与えられたときに、そのすべての要素を逆スパイラル形式で出力する方法を解説します。C++での実装例とともに、アルゴリズムの考え方をわかりやすく説明していきます。 問題の例 まず、具体的な入力と出力の例を見てみましょう。 入力: 12 23 54 67 76 90 01 51 43 18 49 5 31 91 75 9 出力: 18 49 1 90 76 43 31 91 75 9 5 51 67 54 23 12 アルゴリズムの考え方 逆スパイラル形式とは、行列の中心からスタートして、渦巻きの逆順に沿って要素を外側へ向かって出力していく形
-
C++で2次元行列を反時計回りのスパイラル形式で出力する方法
この記事では、2次元行列が与えられたときに、そのすべての要素を反時計回りのスパイラル形式で出力する方法を解説します。 反時計回りのスパイラル形式とは? 反時計回りのスパイラル形式とは、行列の左上の要素から開始し、最初に下方向へ進み、続いて右→上→左と方向を変えながら、渦巻き状に外側から内側へと要素をたどっていく走査方法です。 例として、次の4×4の行列を見てみましょう。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 この行列を反時計回りに走査すると、出力は「1 5 9 13 14 15 16 12 8 4 3 2 6 10
-
C++で隣接する重複文字を含まない最も近い文字列を出力する方法
問題概要この問題では、1つの文字列が与えられます。私たちのタスクは、元の文字列に最も近く、かつ隣接する重複文字を一切含まない文字列を出力することです。具体例を見てみましょう。入力:string = good 出力:goadこの例では、インデックス1と2の文字が同じであるため、インデックス2の文字を変更しています。こうすることで「good」から最も近い形を保ちながら、隣接する重複を取り除いています。解決アプローチこの問題を解くには、文字列を走査しながら、隣接する2つの文字が同じかどうかを確認します。同じ場合は、後ろ側の文字(i番目とi+1番目が一致しているならi+1番目)を変更します。この解法で
-
C++で指定されたソートアルゴリズムが失敗するケースを出力する方法
この問題では、あるソートアルゴリズムと整数 n が与えられます。私たちのタスクは、そのアルゴリズムでは正しくソートできない(つまりアルゴリズムが失敗してしまう)ような、n 個の要素からなる配列を出力することです。 対象となるアルゴリズム loop i from 1 to n-1 loop j from i to n-1 if a[j] > a[i+1] swap(a[i], a[j+1]) このアルゴリズムは二重ループを使用しています。外側のループは 1 から n-1 まで、内側のループは i から n-1 まで繰り返し、各反復ごとに要素