Pythonで3D形状の表面積を計算する方法
問題の概要
N×Nのグリッドを用意し、その中に1×1×1の立方体をいくつか配置することを考えます。grid[i][j] の値 v は、セル (i, j) の上に v 個の立方体が積み重なった「塔」が存在することを表します。このとき、全体としてできあがる3D形状の総表面積を求めるのが目的です。
たとえば、入力が [[1,2],[3,4]] の場合、出力は 34 になります。
解法のアプローチ
表面積は、次の3つの要素に分解して考えると整理しやすくなります。
- 上下の面(z方向):立方体が1つでも置かれているセルには、必ず上面と底面が1つずつ現れます。したがって、この成分は「非ゼロのセル数 × 2」となります。
- 側面(x・y方向):各塔の高さを v とすると、周囲に何もない場合の側面積は 4×v です。まず全セルの値の合計 × 4 を基本値とします。
- 隣接による隠れ:高さ a と b の塔が隣り合うと、接触部分の面 min(a, b) ずつが互いに見えなくなります。そのため、2×min(a, b) を差し引く必要があります。これを行方向と列方向の両方について計算します。
最終的な表面積は、次の式で求められます。
表面積 = 上下の面 + (側面の合計 − 行方向の隠れ − 列方向の隠れ)
手順の詳細
まず、隣接する2つの高さから生じる隠れ面積を返す関数 adjacentArea() を定義します。
areaを 0 で初期化します。- i を 0 から行の長さ − 2 まで繰り返します。
row[i]とrow[i+1]がどちらも非ゼロであれば、area += 2 * min(row[i], row[i+1])を実行します。areaを返します。
続いて、メイン処理では以下を計算します。
z= 非ゼロセルの総数 × 2(上面と底面の分)x_plus_y= グリッド全要素の合計 × 4(すべての側面の分)x_adjacent= 各行に対するadjacentArea()の合計y_adjacent= 各列(zip(*grid)で転置)に対するadjacentArea()の合計- 戻り値 =
z + (x_plus_y - x_adjacent - y_adjacent)
Pythonでの実装例
class Solution:
def surfaceArea(self, grid):
def adjacentArea(row):
area = 0
for i in range(len(row) - 1):
if row[i] and row[i + 1]:
area += 2 * min(row[i], row[i + 1])
return area
z = sum(sum(i > 0 for i in row) for row in grid) * 2
x_plus_y = sum(sum(row) for row in grid) * 4
x_adjacent = sum(adjacentArea(row) for row in grid)
y_adjacent = sum(adjacentArea(row) for row in zip(*grid))
return z + (x_plus_y - x_adjacent - y_adjacent)
ob = Solution()
print(ob.surfaceArea([[1, 2], [3, 4]]))
入力
[[1,2],[3,4]]
出力
34
計算の内訳
この結果がどのように導かれるのか、具体的な数値で確認してみましょう。
z= 非ゼロセルが4つなので 4 × 2 = 8x_plus_y= 合計値が 1+2+3+4 = 10 なので 10 × 4 = 40x_adjacent(行方向)= 2×min(1,2) + 2×min(3,4) = 2 + 6 = 8y_adjacent(列方向)= 2×min(1,3) + 2×min(2,4) = 2 + 4 = 6
よって、表面積 = 8 + (40 − 8 − 6) = 34 となります。
計算量
グリッドの各セルを定数回走査するだけなので、時間計算量は O(N²)、追加の空間計算量は O(1) です。グリッドサイズが大きくなっても効率的に動作するアプローチといえます。
-
Pythonで点のリストから作れる最大の三角形の面積を求める方法
平面上に与えられた点のリストの中から、任意の3点を選んで作ることができる三角形のうち、最も大きな面積を持つものを求める問題です。例えば、入力が [[0,0],[0,1],[1,0],[0,2],[2,0]] の場合、出力は 2 となります。解法のアプローチこの問題は、すべての3点の組み合わせについて三角形の面積を計算し、その最大値を求めることで解けます。手順は以下の通りです。結果を格納する変数 res を 0 で初期化する点のリストのサイズを N とする三重ループで、i、j、k の3つのインデックスの組み合わせをすべて列挙する(i < j < k)各組み合わせに対して、3点の座標
-
Pythonで正四面体の表面積を計算するプログラム(√3×a²の公式)
本記事では、正四面体の表面積を求める問題の解き方とそのアプローチについて詳しく解説します。 問題文 正四面体の一辺の長さが与えられたとき、その正四面体の表面積を求める必要があります。 正四面体とは 正四面体(Tetrahedron)とは、三角形を底面としたピラミッドのような形状の立体図形です。4つの三角形の面(側面に3つ、底面に1つ)と、4つの頂点(角)を持つ立体オブジェクトです。 計算式 一辺の長さを a とすると、正四面体の表面積は次の公式で求められます。 表面積 = √3 × a² この公式をもとに、以下のように面積を計算する関数を定義します。 サンプルコード import math