C++で棒の長さから作れる長方形と正方形の個数を求める方法
問題の概要
この問題では、N本の棒の長さを表す整数の配列が与えられます。これらの棒を選んで作ることができる「長方形」と「正方形」の合計個数を求めて出力するのが課題です。
具体例で問題を確認してみましょう。
入力: array = {5, 5, 7, 7, 1, 4}
出力: 1
説明: 長さ 5, 5, 7, 7 の4本を選ぶことで、1つの長方形を作ることができます。
解き方のポイント
長方形も正方形も、向かい合う辺が同じ長さである図形です。そのため、同じ長さの棒が「2本ずつのペア」になっている必要があり、どちらの図形を作る場合でも必要なのは同じ長さのペア2組(計4本)です。
そこで、以下の手順で解いていきます。
- 配列を昇順にソートする
- 隣り合う要素を比較し、同じ値のペアをカウントする(ペアを見つけたら2つ先へスキップ)
- ペアの総数を2で割った値が、作れる長方形・正方形の個数になる
ソートしておけば、同じ長さの棒は必ず隣接するため、一度の走査でペアをすべて見つけられるのがこの手法の利点です。
C++での実装例
上記の考え方をもとに実装したプログラムがこちらです。
#include <bits/stdc++.h>
using namespace std;
int countRecSqr(int sticks[], int n) {
sort(sticks, sticks + n); // 配列をソート
int pairs = 0;
for (int i = 0; i < n - 1; i++) {
if (sticks[i] == sticks[i + 1]) {
pairs++; // 同じ長さのペアを発見
i++; // 次のペアへスキップ
}
}
return pairs / 2; // ペア2組で1つの図形が作れる
}
int main() {
int sticks[] = { 2, 2, 4, 4, 4, 4, 6, 6, 6, 7, 7, 9, 9 };
int n = sizeof(sticks) / sizeof(sticks[0]);
cout<<"The total number of squares or rectangles that can be created is ";
cout<<countRecSqr(sticks, n);
return 0;
}
実行結果
The total number of squares or rectangles that can be created is 3
コードの解説
サンプルの配列 {2, 2, 4, 4, 4, 4, 6, 6, 6, 7, 7, 9, 9} に対して、隣接要素を比較していくと、(2, 2)、(4, 4)、(4, 4)、(6, 6)、(7, 7)、(9, 9) の6組のペアが見つかります。ペア2組で1つの長方形または正方形が作れるため、6 ÷ 2 = 3 という結果になります。
計算量についても確認しておきましょう。ソート部分が O(n log n)、ペアのカウント部分が O(n) なので、全体の計算量は O(n log n)。要素数が多くても効率的に動作する、シンプルかつ実用的なアルゴリズムです。
-
C++で指定サイズの長方形内に作成できる菱形の個数を数える方法
問題の概要 高さ×幅の寸法をもつ長方形が与えられます。この長方形は2次元座標系上に配置されており、左下の頂点が原点 (0,0) に位置します。今回の目的は、次のすべての条件を満たす菱形がこの長方形内にいくつ作れるかを数えることです。 菱形の面積が0より大きいこと。 菱形の対角線がx軸およびy軸に平行であること。 菱形のすべての頂点が整数座標を持つこと。 入出力例 入力:縦=3、横=3 出力:指定サイズの長方形内に作れる菱形の個数:4 説明:下の図は縦3×横3の長方形です。面積が0より大きく、対角線が両軸に平行で、頂点が整数座標である菱形が4つ存在します。 1つ目 [ (1,0), (2,1
-
C++で木構造のノード数が奇数・偶数となるレベルをすべて出力する方法
この記事では、木(ツリー)構造が与えられたときに、各レベルに含まれるノードの数を調べ、その数が奇数であるレベルと偶数であるレベルをそれぞれ出力する方法を、C++のサンプルコード付きで解説します。 問題の概要 まず、具体的な例を使って概念を確認しましょう。次のような木構造を考えます。 出力: ノード数が奇数のレベル:1, 3, 4 ノード数が偶数のレベル:2 解説: 第1レベルにはノードが1個(奇数)、第2レベルには2個(偶数)、第3レベルには3個(奇数)、第4レベルには1個(奇数)存在します。そのため、奇数となるのは「1, 3, 4」のレベル、偶数となるのは「2」のレベルです。 解き方