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

Pythonプログラム:集合の要素をチェックして幸福度を求める方法

問題の概要

n個の異なる整数からなる配列 nums があるとします。さらに、互いに共通要素を持たない2つの集合 AB も与えられています。

ここで「幸福度(happiness)」というパラメータを用意し、初期値は0とします。配列 nums 内の各整数 i を順番に調べながら、次のルールに従って幸福度を更新していきます。

  • i が集合 A に含まれている場合 → 幸福度を +1 する
  • i が集合 B に含まれている場合 → 幸福度を -1 する

すべての要素を処理し終えた後の、最終的な幸福度の値を求めるのがこの問題の目的です。

具体例

例えば、入力が以下のような場合を考えてみましょう。

  • nums = [1, 2, 5, 8, 6, 3]
  • A = {5, 8, 9, 7, 3}
  • B = {2, 4, 12, 15}

このとき出力は 2 になります。理由は以下の通りです。

  • 5、8、3 は A に含まれるため、幸福度は +3 される
  • 2 は B に含まれるため、幸福度は -1 される
  • 結果として、最終的な幸福度は 3 − 1 = 2 となる

解決の手順

この問題は、以下のステップで解くことができます。

  1. 幸福度を 0 で初期化する
  2. 配列 nums 内の各要素 i について順に処理する
    • i が A に含まれている場合、幸福度を 1 増やす
    • そうでなく i が B に含まれている場合、幸福度を 1 減らす
  3. 最終的な幸福度の値を返す

なお、Pythonの set(集合)はハッシュテーブルで実装されているため、要素の存在確認(in 演算子)は平均 O(1) で行えます。そのため、このアルゴリズム全体の計算量は O(n) となり、非常に効率的です。

実装例

理解を深めるために、以下のPythonコードを見てみましょう。

def solve(nums, A, B):
   happiness = 0
   for i in nums:
      if i in A:
         happiness += 1
      elif i in B:
         happiness -= 1
   return happiness

nums = [1,2,5,8,6,3]
A = {5,8,9,7,3}
B = {2,4,12,15}
print(solve(nums, A, B))

入力

[1,2,5,8,6,3], {5,8,9,7,3}, {2,4,12,15}

出力

2

まとめ

このプログラムでは、配列の各要素を集合 A・B と照合しながら幸福度を加減算することで、最終的な幸福度を簡単に計算できます。set を使った存在確認は高速なので、大量のデータを扱う場合でも安心して利用できるアプローチです。

  1. Pythonで二分木の全ノードの値の合計を求めるプログラム

    二分木(バイナリツリー)にいくつかの値が格納されている場合、木に含まれるすべての値の合計を求めたいことがあります。例えば、次のような二分木が入力として与えられたとします。この場合、出力は 14 になります(2 + 4 + 3 + 5 = 14)。解決のアプローチこの問題を解くには、再帰を使って各ノードを順番に訪問し、値を足し合わせていきます。具体的な手順は以下の通りです。関数 recurse() を定義します。引数としてノードを受け取ります。変数 val に現在のノードの値を代入します。ノードの左の子が存在する場合は、val に左部分木の再帰結果を加算します。ノードの右の子が存在する場合は、v

  2. リスト内の要素の合計を求めるPythonプログラム

    この記事では、Pythonを使ってリスト内のすべての要素の合計を求める方法について、具体的なコード例とともに解説します。問題の定義リストが入力として与えられたとき、そのリストに含まれるすべての要素の合計値を計算する必要があります。例えば、[1, 2, 3, 4, 5]というリストが与えられた場合、出力は 15(1+2+3+4+5)となります。この問題を解くためのアプローチは主に2つあります。1つは組み込み関数を使用する方法、もう1つはブルートフォース(総当たり)方式でループ処理を行う方法です。方法1:組み込み関数 sum() を使うPythonには標準で用意されている組み込み関数 sum()