Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでn×mの長方形内に配置できる2×1サイズの長方形の個数を求める方法

問題概要

2つの整数 nm が与えられたとき、サイズ n × m の長方形の内部に、サイズ 2 × 1 の小さな長方形を最大いくつ配置できるかを求めます。

ただし、以下の条件を満たす必要があります。

  • どの2つの小さな長方形も互いに重なってはならない。

  • すべての小さな長方形は、大きな長方形の内部に完全に収まっていなければならない。ただし、外側の長方形の辺に接することは許容される。

入力例

たとえば、n = 3、m = 3 の場合、出力は 4 になります。

3×3のマス目には、2×1の長方形(ドミノ)を4つ配置でき、残りの1マスだけが空きとなります。

解き方のアプローチ

この問題は、面積の考え方と偶奇の判定を使うことで、シンプルな計算式で解くことができます。手順は以下の通りです。

  • n が偶数の場合: n を2で割った数だけ縦方向に並べられるので、(n / 2) * m を返します。

  • m が偶数の場合: 同様に、(m // 2) * n を返します。

  • n も m も奇数の場合: 面積 n × m は奇数になるため、必ず1マス余ります。したがって、(n * m - 1) // 2 を返します。

ポイントは、2×1の長方形は常に2マス分の面積を占めるため、答えは「使えるマスの総数 ÷ 2」で求められるということです。両方の辺が奇数のときだけ、1マスがどうしても埋められずに残ります。

Pythonでの実装例

それでは、実際のコードを見てみましょう。

def count_rect(n, m):
    if (n % 2 == 0):
        return (n / 2) * m
    elif (m % 2 == 0):
        return (m // 2) * n
    return (n * m - 1) // 2

n = 3
m = 3
print(count_rect(n, m))

入力:

3, 3

出力:

4

まとめ

n×mの長方形に2×1の長方形を何個配置できるかという問題は、偶奇の判定だけでO(1)の計算量で解けることがわかりました。片方でも偶数なら全マスを埋め尽くせますが、両方とも奇数の場合は必ず1マス余る、という性質を覚えておくと、類似のタイル敷き詰め問題にも応用できます。

  1. Pythonで木構造内の距離がちょうどkとなる頂点ペアの個数を求める方法

    問題の概要 整数 k と、n 個のノードからなる木(ツリー構造)が与えられたとします。このとき、頂点間の距離がちょうど k となる異なる頂点ペアの総数を数えるのが課題です。 例として、k = 2 の場合に次のような木が与えられたとします。 このとき、出力は 4 になります。実際、距離がちょうど 2 となるペアは (1, 3)、(1, 5)、(2, 4)、(3, 5) の 4 組です。 解法の考え方 この問題は、深さ優先探索(DFS)を用いたボトムアップの集計によって効率よく解けます。ポイントは、各頂点ごとに「その頂点から距離 j にある子孫ノードの個数」を記録しておき、部分木を統合しながら

  2. Pythonでリスト内の最小値を見つける方法を解説

    この記事では、リストの中から最小の数値を見つける方法について、具体的なサンプルコードとともに詳しく解説します。問題の概要問題: 数値のリストが与えられたとき、その中に含まれる最も小さい数値を画面に表示すること。この問題を解くアプローチは主に2つあります。ひとつは sort() メソッドを使ってリストを昇順に並べ替え、先頭の要素(インデックス0)を取得する方法。もうひとつは、Pythonに標準で用意されている組み込み関数 min() を使う方法です。それぞれ順番に見ていきましょう。方法1:sort()メソッドで並べ替えて最小値を取得するまずはリストを昇順にソートし、先頭の要素を取り出す方法です。