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

Pythonで各列をソート済みにするために削除すべき列の最小数を求める方法

N個の小文字のみで構成された文字列の配列Aがあるとします。すべての文字列は同じ長さです。ここで、任意の削除インデックスの集合を選び、各文字列からそのインデックス位置にある文字をすべて削除できるものとします。

例えば、配列Aが["abcdef", "uvwxyz"]で、削除インデックスが{0, 2, 3}の場合、削除後の最終的な配列は["bef", "vyz"]となり、Aの残りの列は["b","v"]、["e","y"]、["f","z"]となります。

削除インデックスの集合Dを選んだとき、削除後にAの残りの各列が非降順(昇順)にソートされている状態にしたいとします。このとき、Dの長さとしてあり得る最小値を求めるのが問題です。

入力が["cba", "daf", "ghi"]の場合、出力は1になります。これは、D = {1}を選べば、各列["c","d","g"]と["a","f","i"]が非降順にソートされるためです。一方、D = {}(何も削除しない)を選ぶと、列["b","a","h"]が非降順にならず、条件を満たせません。

解法のアプローチ

この問題は、次の手順で解くことができます。

  • A:配列から文字列を取り出し、文字ごとに異なる列へ分割した行列を作成する
  • B:新しい空のリストを作成する
  • A内の各列colに対して以下を繰り返す
    • colがすでにソート済みであれば、Bに0を挿入する
    • そうでなければ、Bに1を挿入する
  • Bの全要素の合計を返す(これが削除が必要な列の数になる)

理解を深めるために、以下の実装例を見てみましょう。

実装例

class Solution:
   def minDeletionSize(self, A):
      return sum([1-(sorted(col)==list(col)) for col in zip(*A)])
ob = Solution()
print(ob.minDeletionSize(["cba","daf","ghi"]))

このコードでは、zip(*A)を使うことで配列を転置し、各行(元々の文字列)を行方向から列方向へ変換しています。その上で、sorted(col) == list(col)によって各列がすでにソート済みかどうかを判定し、ソートが必要な列だけをカウントして合計しています。非常に簡潔でPythonらしい一行での実装となっています。

入力

["cba","daf","ghi"]

出力

1
  1. Pythonでインドの国旗を描く方法!NumPyとMatplotlibを使った完全ガイド

    Pythonのグラフ描画ライブラリは非常に多機能で、単なるデータの可視化にとどまらず、国旗のような図形も自由に描くことができます。その意味で、これらのモジュールには芸術的な一面もあると言えるでしょう。この記事では、numpyとmatplotlibというライブラリを使って、インドの国旗を描く方法をわかりやすく解説します。 インド国旗の構成要素 インドの国旗は、上から順にサフラン(オレンジ)、白、緑の3本の横帯で構成され、中央には24本のスポークを持つ紺色の車輪「アショーカ・チャクラ」(法輪)が描かれています。各要素には次のような意味が込められています。 サフラン(オレンジ):勇気と自己犠牲

  2. Pythonでファイルを削除する方法をわかりやすく解説

    Pythonでファイルを削除する基本の方法 Pythonでは、標準ライブラリのosモジュールを使うことで、単一のファイルや空のフォルダ(ディレクトリ)を簡単に削除できます。外部ライブラリのインストールは不要で、import osと記述するだけですぐに利用できるのが魅力です。 os.remove() でファイルを削除する たとえば、カレントディレクトリにある my_file.txt というファイルを削除したい場合は、次のように記述します。 >>> import os >>> os.remove(my_file.txt) os.remove() の引数には、削