Pythonで島(図形)の周囲長を求めるアルゴリズムと実装方法
問題の概要
0が空きセル、1がブロック(図形の一部)を表す2値行列を考えます。このとき、図形の周囲長(外周の長さ)を求めるのが課題です。なお、図形の内部に穴は存在しないものとします。
例えば、次のような入力が与えられた場合を考えてみましょう。
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 1 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 1 | 1 | 0 |
| 0 | 0 | 0 | 0 | 0 |
この場合の出力は 14 になります。
解法のアプローチ
基本的な考え方はシンプルです。各セルは最大で4つの辺を外周に持ちますが、隣接するセルも1である場合、その共有される辺は外周に含まれません。そこで、以下の手順で計算を行います。
- d := 0(現在の行インデックス)、perimeter := 0(周囲長の合計)で初期化する
- height := 行数、length := 列数 を取得する
- 行列の各行について以下を繰り返す
- c := 0(列インデックス)で初期化する
- 行内の各値について以下を繰り返す
- 値が1の場合
- surround := 4 とする
- c が length - 1 でない場合、右隣 matrix[d][c + 1] が1なら surround を1減らす
- c が 0 でない場合、左隣 matrix[d][c - 1] が1なら surround を1減らす
- d が height - 1 でない場合、下のセル matrix[d + 1][c] が1なら surround を1減らす
- d が 0 でない場合、上のセル matrix[d - 1][c] が1なら surround を1減らす
- perimeter := perimeter + surround
- c := c + 1
- 値が1の場合
- d := d + 1
- 最後に perimeter を返す
それでは、実際の実装例を見て理解を深めましょう。
実装例
class Solution: def solve(self, matrix): d = 0 perimeter = 0 height = len(matrix) length = len(matrix[0]) for line in matrix: c = 0 for val in line: if val == 1: surround = 4 if c != length - 1: if matrix[d][c + 1] == 1: surround -= 1 if c != 0: if matrix[d][c - 1] == 1: surround -= 1 if d != height - 1: if matrix[d + 1][c] == 1: surround -= 1 if d != 0: if matrix[d - 1][c] == 1: surround -= 1 perimeter += surround c += 1 d += 1 return perimeter ob = Solution() matrix = [ [0,0,0,0,0], [0,0,1,1,1], [0,0,1,1,0], [0,1,1,1,0], [0,0,0,0,0] ] print(ob.solve(matrix))
入力
matrix = [ [0,0,0,0,0], [0,0,1,1,1], [0,0,1,1,0], [0,1,1,1,0], [0,0,0,0,0]]
出力
14
補足:計算量と別のアプローチ
このアルゴリズムの計算量は O(行数 × 列数) です。すべてのセルを一度ずつ調べるだけで済むため、非常に効率的な手法といえます。
また、別の視点として「1のセルの総数 × 4 − 隣接しているペアの総数 × 2」という式でも周囲長を求められます。これは、隣接する2つのセルが互いに1辺ずつ外周から失うためです。どちらの方法でも同じ結果が得られるので、実装しやすい方を選ぶとよいでしょう。
-
Pythonで円柱の周囲の長さを求めるプログラムの書き方
この記事では、入力された直径と高さから円柱の周囲の長さ(外周)を求める方法について解説します。問題の概要円柱の直径と高さが与えられたとき、その円柱の周囲の長さを計算します。ここでいう「周囲」とは、円柱を横から見たときの輪郭、つまり長方形の外形線のことを指します。円柱の側面を展開すると長方形になるため、その周囲は次の式で表せます。周囲の長さ = 2 × ( 高さ h + 直径 d )d:円柱の直径h:円柱の高さそれでは、実際にPythonで実装してみましょう。実装例# 円柱の周囲の長さを計算する関数 def perimeter(diameter, height): return 2 *
-
Pythonで円柱の周囲長を求めるプログラムの書き方
この記事では、以下の問題をPythonを使って解く方法を解説します。 問題の定義 問題: 直径と高さを入力として受け取り、円柱の周囲長を求める。 ここでいう「周囲長」とは、円柱を横から見たときに現れる長方形の外周のことです。つまり、円柱の側面を展開すると長方形になり、その縦が円柱の高さ、横が円の直径(円周ではありません)に相当します。 したがって、周囲長は次の式で表せます。 周囲長 = 2 × ( 高さ h + 直径 d ) d:円柱の直径 h:円柱の高さ 実装例 それでは、実際のコードを見てみましょう。 # 円柱の周囲長を計算する関数 def perimeter(diameter, he