トンネルを通過できる箱の体積を求めるCプログラム
高さが41、幅が非常に大きいトンネルがあるとします。また、長さ・幅・高さを持つ箱のリストが与えられます。箱の高さがトンネルの高さより厳密に小さい場合のみ、その箱はトンネルを通過できます。このとき、トンネルを通過できる箱の体積をすべて求める必要があります。体積は「長さ × 幅 × 高さ」で計算されます。入力として、箱の個数Nと、N行3列の2次元配列が与えられます。
例えば、入力が N = 4、boxes = [[9,5,20],[3,7,15],[8,15,41],[6,3,42]] の場合、出力は 900 と 315 になります。最初の2つの箱は通過条件を満たしており、体積はそれぞれ 9 × 5 × 20 = 900、3 × 7 × 15 = 315 です。残りの2つの箱は高さが41以上のため、トンネルを通過できません。
解決のアプローチ
この問題を解くためには、以下の手順に従います。
- 長さ(length)、幅(width)、高さ(height)を持つ Box 構造体を定義する
- 箱を引数に取る関数 volume() を定義する
- box.length × box.width × box.height を返す
- 箱を引数に取る関数 lower() を定義する
- box.height が 41 未満であれば true、そうでなければ false を返す
- main 関数で以下の処理を行う
- i := 0 から開始し、i < N の間、i を1ずつ増やしながら繰り返す
- lower(boxes[i]) が true の場合:
- volume(boxes[i]) を表示する
- lower(boxes[i]) が true の場合:
実装例
以下の実装例を見ると、理解が深まります。
#include <stdio.h>
#define N 4
struct Box{
int length, width, height;
};
int volume(struct Box box){
return box.length*box.width*box.height;
}
int lower(struct Box box){
return box.height < 41;
}
int solve(struct Box boxes[]){
for (int i = 0; i < N; i++)
if (lower(boxes[i]))
printf("%d\n", volume(boxes[i]));
}
int main(){
struct Box boxes[N] = {{9,5,20},{3,7,15},{8,15,41},{6,3,42}};
solve(boxes);
}
入力
4, {{9,5,20},{3,7,15},{8,15,41},{6,3,42}}
出力
900 315
コードの解説
構造体 Box は箱の寸法(長さ・幅・高さ)を表します。volume() 関数は3辺を掛け合わせて体積を計算し、lower() 関数は箱の高さがトンネルの高さ41未満かどうかを判定します。solve() 関数では、すべての箱を先頭から順に調べ、通過条件を満たす箱の体積だけを標準出力に表示します。
このように、条件判定と体積計算をそれぞれ独立した関数として分離することで、コードの可読性と再利用性が向上します。トンネルの高さを変更したい場合も、lower() 関数内の定数を書き換えるだけで対応できる点も実用上のメリットです。
-
Pythonで制約付きの建物の最大高さを求めるプログラム
問題の概要整数 n と制約リスト restrictions が与えられたとします。私たちは都市に n 棟の新しい建物を一列に建てようとしていますが、高さに関するいくつかの制限があります。建物には左から順に 1 から n までの番号が付けられており、各制約は restrictions[i] = (id_i, max_height_i) の形式で表され、「id_i 番の建物の高さは max_height_i 以下でなければならない」ことを意味します。建物の高さに関する都市の規則は以下のとおりです。各建物の高さは 0 以上でなければなりません。1 番の建物(最初の建物)の高さは必ず 0 です。隣接す
-
Pythonでグリッド内のボールの着地位置を求めるプログラム
問題概要 m × n のグリッドボックスを考えます。各セルには、左上から右下、もしくは右上から左下へ向けて斜めの板が設置されています。グリッドの上端からボールを落とし、それぞれのボールが底まで到達できるか、そしてどの列に着地するのかを求めるのがこの問題です。 グリッドは行列として与えられ、各セルの値は板の向きを表します。 1: 左上から右下へ下る斜めの板 -1: 右上から左下へ下る斜めの板 n 個のボールを上端の各列から順に落としたとき、底に到達したボールの着地列を答えとして返します。途中で側面の壁に当たったり、V字型の溝にはまって動けなくなったボールについては -1 を出力します。 3