-
Pythonで組み合わせの総和(Combination Sum)を求める再帰アルゴリズムの解説
組み合わせの総和問題とは 候補となる数値のリスト(すべての要素が一意)と目標値が与えられたとき、候補の数値を足し合わせて目標値と一致する、すべての一意な組み合わせを求めるのが「組み合わせの総和」問題です。このとき、同じ数値は何度でも繰り返し使用できる点が特徴です。 たとえば、要素が [2,3,6,7] で目標値が 7 の場合、考えられる出力は [[7], [2,2,3]] となります。 解法のアプローチ この問題は再帰処理によって解きます。再帰関数 solve() は、結果を保存する配列(res)、重複チェック用の辞書(map)、目標値(target)、そして一意な要素のリスト(elemen
-
Pythonで解くジャンプゲーム問題 ― 最後のインデックスに到達できるか判定するアルゴリズム
ジャンプゲーム問題とは非負の整数からなる配列が与えられ、最初は配列の先頭(インデックス0)にいるものとします。各要素は、その位置から最大で何ステップ先へジャンプできるかを表しています。このとき、配列の最後のインデックスに到達できるかどうかを判定するのがこの問題です。例として、配列 [2,3,1,1,4] を考えてみましょう。インデックス0から1へ1ステップ移動し、次にインデックス1から最大3ステップ跳べるため、そのまま最後まで到達できます。したがって答えは True になります。解法のアプローチ:後ろから追跡する貪欲法この問題は、配列を後ろから走査する貪欲法(Greedy)で効率よく解けます。
-
Pythonで重複する区間をマージするアルゴリズムの実装方法
はじめに区間(インターバル)のコレクションが与えられたとき、重なり合っているすべての区間を1つに統合(マージ)する問題を考えてみましょう。例えば、区間が [[1,3], [2,6], [8,10], [15,18]] のように与えられた場合、マージ後の結果は [[1,6],[8,10],[15,18]] となります。これは、[1,3] と [2,6] の2つの区間が互いに重なっているため、これらを統合して [1,6] とするからです。解法のアプローチこの問題は以下の手順で解くことができます。区間リストの長さが0の場合、空のリストを返すクイックソートなどのソート手法を使って、区間リストを開始位置
-
PythonでスパイラルマトリックスIIを実装!螺旋状の正方行列を生成するアルゴリズム
スパイラルマトリックスIIとは 正の整数 n が与えられたとき、1 から n² までの数字を外側から内側へ渦巻き状に配置した n×n の正方行列を生成するのが「スパイラルマトリックスII」の問題です。 例えば n = 4 の場合、生成される行列は以下のようになります。 12341213145111615610987 数字が時計回りの渦巻き状に並んでいるのが分かります。この記事では、この行列を Python で生成するアルゴリズムの考え方と実装例をわかりやすく解説します。 アルゴリズムの考え方 基本となるアイデアは、「行列の外周を上→右→下→左の順に埋め、1周終わるごとに境界を内側へ1つずつ狭め
-
PythonでUNIXスタイルのファイルパスを簡素化(正規化)する方法
はじめに UNIXスタイルのファイルシステムでは、ファイルの絶対パスが与えられたとき、それを「正規パス(カノニカルパス)」へと簡素化する必要があります。UNIX形式のファイルシステムにおいて、単一のピリオド「.」は現在のディレクトリを表し、二重のピリオド「..」は一つ上の階層(親ディレクトリ)への移動を意味します。 正規パスには、以下のような性質が求められます。 パスは必ずスラッシュ「/」で始まること ディレクトリ名同士の間には、スラッシュ「/」が1つだけ存在すること 最後のディレクトリ名が存在する場合、末尾にスラッシュ「/」を付けないこと 正規パスは、絶対パスを表す最短の文字列であること
-
Pythonで行列をインプレースでゼロ化するアルゴリズム
ある行列が与えられたとき、その中に0 の要素が1つでも存在すれば、その要素を含む行と列全体をすべて 0 に置き換えます。この変換はインプレース(追加の行列を使用せず、元の配列上で直接書き換える)方式で行う必要があります。問題の例たとえば、次のような3×3の行列があったとします。101111111この場合の出力は以下のようになります。000101101左上(0行目・0列目の交点)に 0 があるため、0行目と0列目がすべて 0 に変わっていますね。アルゴリズムの手順この問題では、行列の1行目と1列目をフラグ(マーカー)として活用することで、追加メモリ O(1) で解くことができます。手順は以下の通
-
Pythonで部分集合(冪集合)をすべて生成する方法を解説
はじめにある数値の集合が与えられたとき、その集合から作れるすべての部分集合を生成する問題を考えてみましょう。この「すべての部分集合の集まり」は冪集合(べきしゅうごう、Power Set)と呼ばれます。例えば、集合が [1, 2, 3] の場合、冪集合は次のようになります。[[], [1], [2], [3], [1,2], [1,3], [2,3], [1,2,3]]要素数が n の集合に対して部分集合は 2n 個存在するため、n = 3 なら 8 個の部分集合が得られます。アルゴリズムの考え方:再帰による解法この問題は再帰(バックトラッキング)を使って elegantly 解くことができます
-
Pythonで2次元グリッド内の単語検索を実装する方法【再帰・バックトラッキング】
2次元のボード(グリッド)と1つの単語が与えられたとき、その単語がグリッド内に存在するかどうかを判定する問題を考えてみましょう。単語は、順番に隣接するセルの文字をつなげて構成されます。ここでいう「隣接」とは、上下左右に位置するセルのことです。また、同じセル(同じ文字)を複数回使用することはできません。例として、次のようなマトリックスがあるとします。ABCESFCSADEFこのとき、単語「ABCCED」が与えられれば答えは True、「SEE」も True になります。しかし「ABCB」の場合は、同じセルを再利用できないため False となります。解法のアプローチ:再帰とバックトラッキングこの
-
Pythonで前順走査と中間順走査の結果から二分木を構築する方法
二分木の中間順走査(inorder)と前順走査(preorder)の結果が与えられたとき、それらをもとに元の二分木を復元することを考えます。例えば、前順走査の結果が [3,9,20,15,7]、中間順走査の結果が [9,3,15,20,7] である場合、構築される二分木は次のようになります。アルゴリズムの考え方この問題は再帰を使うことで簡潔に解けます。鍵となるのは以下の2つの性質です。前順走査の最初の要素は必ず根(ルート)である中間順走査において、ルートより左側の要素は左部分木、右側の要素は右部分木に属する処理の手順buildTree メソッドに前順走査リスト(preorder)と中間順走査リ
-
Pythonで中順走査(インオーダー)と後順走査(ポストオーダー)から二分木を構築する方法
はじめに 二分木の中順走査(インオーダー)と後順走査(ポストオーダー)の結果が分かっていれば、この2つの列を組み合わせることで元の二分木を一意に復元できます。 例として、後順走査の列が [9,15,7,20,3]、中順走査の列が [9,3,15,20,7] である場合、構築される二分木は次の構造になります。 3 / \ 9 20 / \ 15 7 アルゴリズムの手順 再帰的に木を組み立てていきます。ここではメソッド名を buildTree とし、基本の流れは以下のとおりです。 根の決定: 後順走査の「最後の要素」が必ず根(ル
-
Pythonで解く「囲まれた領域(Surrounded Regions)」問題:DFSを使った効率的な解法
問題の概要 XとOで構成された2次元ボードが与えられます。この中から、Xによって四方を完全に囲まれたOの領域をすべて「捕捉」します。捕捉とは、その囲まれた領域内のOをすべてXへ置き換えることを指します。 注意すべき点として、ボードの外周(端)に接しているOはボードの外側とつながっているため「囲まれていない」とみなされ、変換の対象外になります。 入力ボードの例 XXXX XOOX XXOX XOXX 処理後の出力 中央付近のOはXに完全に囲まれているため、すべてXへ変換されます。一方、下端にあるOはボードの境界に接しているため、そのままOとして残ります。 XXXX XXXX XXXX
-
Pythonで解く最大積部分配列問題【動的計画法の実装例】
問題の概要 整数配列 nums が与えられたとき、配列内の連続する部分配列(少なくとも1つの要素を含む)の中で、積が最大になるものを見つける問題です。 例えば、配列が [2,3,-2,4] の場合、出力は 6 になります。これは連続する部分配列 [2,3] の積 2×3=6 が最大だからです。 解法のアプローチ この問題は動的計画法(DP)を活用して解くのが効果的です。重要なポイントは、配列に負の数が含まれる可能性があることです。負の数同士を掛け合わせると正の数になるため、それまでの「最小の積」が突然「最大の積」に変わることがあります。 そこで、各インデックスにおいて「その位置で終わる部分配
-
Pythonで国勢調査データを分析する方法|インドの人口統計データを可視化してみよう
国勢調査(センサス)とは、特定の対象人口に関する情報を体系的に記録・収集する取り組みです。収集されるデータには、人口統計、経済状況、居住環境など、さまざまなカテゴリの情報が含まれています。これらのデータは、政府が現状を正確に把握し、将来に向けた政策立案を行ううえで重要な基礎資料となります。本記事では、Pythonを活用してインドの国勢調査データを分析する方法を解説します。人口動態や経済指標など複数の観点からデータを掘り下げ、その結果をグラフとして視覚的に表現します。使用するデータセットはKaggleから入手した「India Districts Census 2011」です。データの準備と読み込
-
PythonのExpatモジュールを使った高速XML解析の基本と実装例
Pythonには、XMLデータを読み込んで処理するための標準モジュールとしてexpatが用意されています。expatは「非検証型(non-validating)」のXMLパーサーであり、軽量かつ高速に動作するのが特徴です。仕組みとしては、まずXMLパーサーオブジェクトを生成し、そのオブジェクトが持つ各種イベントをハンドラ関数に紐付けて処理を行います。本記事では、ハンドラ関数を活用してXMLファイルから要素や属性値を読み取り、出力データとして取得する方法を具体例とともに解説します。ここで生成したデータは、その後のさまざまな処理に利用できます。Expatの主なハンドラ関数expatでは、XMLの解
-
Pythonで実現するクレジットカード不正検出:機械学習による実装ガイド
クレジットカード取引をはじめとする大量の取引データには、不正(Fraud)が潜んでいます。機械学習アルゴリズムを活用すれば、過去のデータを学習させ、新しい取引が不正である可能性を予測できます。 本記事では、Kaggleで公開されているクレジットカード取引データセットを題材に、データの分析から特徴量とラベルの作成、機械学習モデルの構築までを段階的に解説します。最後に、モデルの精度(Accuracy)、適合率(Precision)、再現率(Recall)、F値(F-score)を算出して評価します。 1. データの準備 最初のステップでは、ソースデータを読み込み、含まれる変数を把握し、サンプル
-
Pythonで顧客離反(チャーン)を予測する方法:機械学習による実践ガイド
あらゆるビジネスは顧客のロイヤルティに依存しています。リピート購入は企業の収益性を支える重要な柱の一つであり、顧客が離れていく理由を把握することは極めて重要です。このように顧客が離反していく現象は「カスタマーチャーン(Customer Churn)」と呼ばれます。過去の傾向を分析することで、どのような要因が顧客離反に影響を与えているのかを把握し、特定の顧客が離反するかどうかを予測できるようになります。本記事では、機械学習アルゴリズムを使って過去の顧客離反データの傾向を分析し、どの顧客が離反する可能性が高いかを判定する方法を解説します。データの準備例として、通信業界(Telecom)の顧客離反デ
-
PythonでExcelファイルを操作する方法|openpyxl・xlwt・xlsxwriterの使い方徹底解説
Excelは世界で最も広く使われている表計算ソフトであり、パソコンユーザーのほとんどがスプレッドシートによるデータ管理に慣れ親しんでいます。そのため、Pythonでプログラムを開発していると、いずれExcelファイルと連携する必要が生じる場面が必ず訪れます。 幸い、PythonにはExcelファイルの作成・読み取り・書き込みを実現できるライブラリが数多く存在します。本記事では、特に重要な3つのライブラリ「openpyxl」「xlwt」「xlsxwriter」の具体的な使い方を、サンプルコード付きで解説します。 1. openpyxlで.xlsxファイルを読み書きする openpyxlは、Exc
-
Pythonで身につける統計的思考 ― グラフとチャートによるデータ分析入門
統計学は、機械学習(ML)やAIを学ぶうえで欠かせない基礎知識です。これらの技術分野ではPythonが事実上の標準言語となっているため、統計分析を取り入れたPythonプログラムの書き方をマスターすることが重要になります。本記事では、さまざまなPythonライブラリを活用してグラフやチャートを作成する方法を解説します。多様なチャートを使いこなせるようになると、データを素早く分析し、結論を視覚的に導き出せるようになります。 データの準備 ここでは、さまざまな種子(シード)に関するデータを含むデータセットを使用します。このデータセットはKaggleから入手でき、URLは後述のサンプルコード内に記載
-
Pythonでのアスタリスク(*と**)の使い方を徹底解説
Pythonでは、アスタリスク「*」とダブルアスタリスク「**」がさまざまな場面で登場します。一見同じ記号に見えますが、使われる文脈によって意味が大きく異なります。本記事では、それぞれの具体的な使い方と活用シーンを実行例とともに分かりやすく解説します。中置演算子としての「*」「*」を中置演算子として使うと、数値の積(掛け算)を求めることができます。整数・浮動小数点数・複素数など、数値型であれば同様に乗算が可能です。例:数値の乗算# 整数 x = 20 y = 10 z = x * y print(z) # 浮動小数点数 x1 = 2.5 y1 = 5.1 z1 = x1 * y1 print
-
Pythonで日付と時刻を操作する方法|datetimeモジュールの基本と活用例
日付と時刻の操作は、あらゆるプログラミング言語において欠かせない処理の一つです。Pythonでは標準ライブラリとしてdatetimeモジュールが提供されており、日付や時刻に関する計算に必要な機能がほぼすべて揃っています。この記事では、実際のコード例を交えながら、Pythonでの日時処理の基本をわかりやすく解説します。 現在の日付と時刻を取得する datetimeモジュールには、同名の「datetime」クラスが含まれています。このクラスをインポートし、now()メソッドを呼び出すことで、現在の日時を持つdatetimeオブジェクトを生成できます。生成したオブジェクトには現在の日付・時刻のすべて