-
Pythonで3要素の合計がターゲット未満となるトリプレットの個数を数えるプログラム
問題の概要 数値のリスト nums と値 target が与えられたとき、nums[i] + nums[j] + nums[k] < target を満たすトリプレット(i < j < k)の個数を求めることを考えます。 例えば、入力が nums = [-2, 6, 4, 3, 8]、target = 12 の場合、出力は 5 になります。条件を満たすトリプレットは以下の通りです。 [-2, 6, 4] [-2, 6, 3] [-2, 4, 3] [-2, 4, 8] [-2, 3, 8] 解法のアプローチ すべての組み合わせを総当たりで調べると O(n³) の計算量が必
-
Pythonで合計がkに最も近い3つの異なる要素をリストから見つけるプログラム
この記事では、数値のリスト nums ともう一つの値 k が与えられたとき、|a + b + c − k| が最小になるようにリスト内の3つの異なる要素 (a, b, c) を選び、その絶対差を返す方法を解説します。問題の例たとえば、入力が nums = [2, 5, 25, 6]、k = 14 だった場合を考えてみましょう。[2, 5, 6] を選ぶと合計は13になり、14に最も近づきます。したがって絶対差は |13 − 14| = 1 となり、出力は 1 です。解法のアプローチ(二ポインタ法)この問題は、ソートと「二ポインタ」テクニックを組み合わせることで効率的に解けます。手順は以下の通り
-
Pythonで二分木の各ノードの値が子ノードの値の合計と一致するか判定するプログラム
二分木が与えられたとき、葉ノードを除くすべてのノードについて、その値が「左の子ノードの値 + 右の子ノードの値」と一致しているかどうかを判定する必要があります。例えば、次のような二分木が入力として与えられた場合を考えてみましょう。この場合、根ノード18 = 8 + 10、ノード8 = 3 + 5 というように、すべての内部ノードで条件が成り立っているため、出力は True になります。解決のアプローチこの問題は、DFS(深さ優先探索)を使って木を再帰的に走査することで解決できます。手順は以下の通りです。dfs() 関数を定義します。引数として root を受け取ります。root が null(
-
Pythonで左右の部分木の入れ替えにより2つの二分木を一致させられるか判定する方法
問題の概要 2つの二分木が与えられたとき、任意のノードについて左部分木と右部分木を何度でも入れ替えてよいと仮定します。この操作を繰り返すことで、1つ目の木を2つ目の木とまったく同じ形に変換できるかどうかを判定するのが、この記事で扱う問題です。 例えば、次のような2つの木が入力として与えられた場合、左右の入れ替えによって一致させられるため、出力は True になります。 解決のアプローチ この問題は、幅優先探索(BFS)の考え方を使い、木をレベル(深さ)ごとに処理しながらノードの値を比較することで解けます。左右の入れ替えによって同じレベル内の値の並び順は反転し得るため、「順方向」または「逆方
-
Pythonで二分木が対称木(シンメトリックツリー)かどうかを判定するプログラム
ある二分木が与えられたとき、その木が対称木(シンメトリックツリー)であるかどうかを判定します。対称木とは、鏡像(左右反転した像)をとったときに元の木と完全に一致するような木のことです。例えば、左右の子部分木が互いに鏡写しの関係になっている木は対称木とみなされます。この判定を行うためのアプローチは以下の通りです。解法の考え方再帰的に処理を行う関数 solve(root, root) を呼び出します。同じノードを2つの引数として渡すのがポイントです。比較対象の2つのノード(node1 と node2)がどちらも空(None)の場合、True を返します。どちらか一方だけが空の場合、構造が一致してい
-
Pythonでstart値をend値に変換するための最小操作回数を求めるプログラム
問題概要2つの整数 start と end が与えられたとき、次の2種類の操作のみを使って start を end に変換するために必要な最小の操作回数を求めます。値から 1 を引く(デクリメント)値に 2 を掛ける(倍にする)例として、start = 2、end = 7 の場合を考えてみましょう。このとき出力は 3 になります。具体的には、2 に 2 を掛けて 4 にし、さらに 2 を掛けて 8 にし、最後に 1 を引いて 7 にするという流れです。解き方のアプローチこの問題は、end 側から逆算していくことで効率的に解けます。start から end へ向かうのではなく、end を sta
-
Pythonでタスクを最短時間でスケジュールするプログラム
問題の概要 「tasks」という値のリストがあり、それぞれ異なる値は異なるタスクの種類を表しているとします。さらに、負でない整数 k も与えられます。各タスクの完了には1分かかりますが、同じ種類のタスクを2回実行する間には、少なくとも k 分の待ち時間を挿入しなければなりません。どの時点でも、タスクを実行することも待機することも可能です。このとき、すべてのタスクを完了させるのに必要な最小の時間を求めるのが目的です。 例として、入力が nums = [2, 2, 2, 3, 3, 2]、k = 1 の場合を考えてみましょう。このとき出力は 7 になります。最適な実行順序が [2, 3, 2,
-
Pythonで迷路の右下隅に到達するまでの最小マス数を求めるプログラム
0が空きマス、1が壁を表す2次元グリッド(迷路)があるとします。左上の grid[0][0] からスタートし、グリッドの右下隅に到達するまでに通過する必要のあるマスの最小数を求めます。もし右下隅に到達できない場合は −1 を返します。例えば、入力が以下のような場合を考えてみましょう。000100100この場合、出力は 5 となります。解法のアプローチ:幅優先探索(BFS)この問題は幅優先探索(BFS)を使うことで効率的に解けます。BFSは最短経路を求めるのに適したアルゴリズムで、各セルに到達した時点での移動回数を記録しながら探索を進めます。具体的な手順は以下の通りです。R := グリッドの行数
-
Pythonで全員が集まる最適な場所の最小移動距離を求めるプログラム
問題概要2次元の行列(グリッド)が与えられ、そこには以下のような値が含まれています。0:空きセル1:壁2:人人は上下左右の4方向に移動できます。このとき、壁以外のセルの中から、すべての人がそのセルまで歩く合計距離が最小になる「集合場所」を見つけ、その最小距離を求めるのが目的です。入力例201010120022この場合の出力は 7 になります。最適な集合場所は右下の角です。解法のアプローチこの問題は、各人の位置から幅優先探索(BFS)を実行し、グリッド上のすべてのセルへの移動コストを計算することで解けます。具体的な手順は以下の通りです。twos(人の位置ごとのキュー)と costs(各人から各セ
-
Pythonで二分木の全ノードの値の合計を求めるプログラム
二分木(バイナリツリー)にいくつかの値が格納されている場合、木に含まれるすべての値の合計を求めたいことがあります。例えば、次のような二分木が入力として与えられたとします。この場合、出力は 14 になります(2 + 4 + 3 + 5 = 14)。解決のアプローチこの問題を解くには、再帰を使って各ノードを順番に訪問し、値を足し合わせていきます。具体的な手順は以下の通りです。関数 recurse() を定義します。引数としてノードを受け取ります。変数 val に現在のノードの値を代入します。ノードの左の子が存在する場合は、val に左部分木の再帰結果を加算します。ノードの右の子が存在する場合は、v
-
Pythonで方向リストを使って二分木を走査するプログラム
二分木と、R(右)、L(左)、U(上)からなる文字列のリスト moves が与えられているとします。ルートから出発し、moves の各指示に従って木をたどります。R は右の子ノードへ移動、L は左の子ノードへ移動、U は親ノードへ戻ることを意味します。例えば、次のような二分木があったとします。入力が [R, R, U, L] の場合、出力は 3 になります。解決のアプローチこの問題は、通過したノードの履歴をスタック(リスト)で管理することで解決できます。手順は以下の通りです。空のリスト past を用意します。moves 内の各移動指示に対して、以下を繰り返します。まず現在のノードを past
-
Pythonで文字列の左右をトリミングして作れる回文の数を求めるプログラム
文字列 s が与えられたとき、s の左右をトリミング(切り詰める)ことで得られる回文の個数を求める問題を考えてみましょう。例えば、入力が s = momo の場合、出力は 6 になります。これは「mom」「omo」「m」「m」「o」「o」の6つの回文を作ることができるためです。この問題を解くために、以下の手順に従います。関数 expand() を定義します。引数として i、j、s を受け取ります。カウンタ c := 0 で初期化します。i >= 0 かつ j が s の長さ未満 かつ s[i] == s[j] である間、以下を繰り返します。i := i − 1、j := j + 1 とす
-
Pythonで2つの二分木が完全に同じかどうかを判定するプログラム(構造と値の比較)
2つの二分木が与えられたとき、それらが構造と値の両方の観点で完全に一致しているかどうかを確認します。このような木のペアは「双子の木(twin trees)」と呼ばれることがあります。 たとえば、次のような入力があったとします。 この場合、最初のペアに対する出力は True になります。一方、2番目と3番目のペアは、それぞれ「値が異なる」ケースと「構造が異なる」ケースに該当するため、出力は False になります。 解決のアプローチ この問題は、再帰的な手法を用いて解くことができます。具体的には、以下の手順に従います。 solve() メソッドを定義し、2つのルートノードを受け取るようにしま
-
Pythonで合計がkとなる重複しない2つの部分リストの長さの合計を求めるプログラム
数値のリスト nums と別の値 k が与えられます。nums の中から互いに重ならない2つの部分リスト(サブリスト)を見つけ、それぞれの要素の合計が k と等しくなるようにします。そして、その2つの部分リストの長さの合計を求めるのがこの問題です。 条件を満たす組み合わせが複数存在する場合は、最も短い2つの部分リストを選び、その長さの合計を返します。条件を満たす組み合わせが見つからない場合は -1 を返します。 具体例 たとえば、入力が次の場合を考えてみましょう。 nums = [7, 10, -2, -1, 4, 3]、k = 7 このとき出力は 3 になります。[7](長さ1)と [4,
-
Pythonで全乗客の乗車・降車が車両の定員内で可能かどうかを判定するプログラム
問題の概要 requested_trips という行列(リスト)があるとします。各行は [start_x, end_x, num_passengers] の形式で構成されており、これとは別に車両の定員を表す capacity(容量)の値が与えられています。各トリップは「位置 start_x で num_passengers 人の乗客を乗せ、end_x で全員を降ろす」という乗降リクエストを意味します。 車は与えられた定員を持ち、位置 x = 0 から出発します。ただし、車は右方向(正の方向)にしか移動できないものとします。このとき、すべての乗客を乗せて降ろすことが可能かどうかを判定するのが目的
-
Pythonでリスト内のすべての値の出現回数が一意かどうかを確認する方法
正または負の整数を含むリスト nums が与えられたとき、配列内のすべての値の出現回数が一意(重複がない)であるかどうかを確認する必要があります。 例えば、入力が nums = [6, 4, 2, 9, 4, 2, 2, 9, 9, 9] の場合、出力は True になります。これは、6 が 1 回、4 が 2 回、2 が 3 回、9 が 4 回出現しており、すべての出現回数が互いに異なるためです。 この問題を解決するには、以下の手順に従います。 num_counts := 各値とその出現回数を格納する新しいマップ(辞書)を作成します occurrences := num_counts の
-
Pythonで二分木のすべてのノードの値が同じかどうかをチェックするプログラム
問題の概要二分木が与えられたとき、その木に含まれるすべてのノードが同じ値を持っているかどうかを判定することを考えます。例えば、次のような二分木が入力として与えられた場合、すべてのノードが同じ値を持っているため、出力は True になります。解決のアプローチこの問題は、再帰を使ってシンプルに解くことができます。以下の手順に従います。solve() 関数を定義します。この関数は root(現在のノード)と val(比較対象の値)を引数として受け取ります。root が null(None)の場合は、True を返します。空の部分木は条件を満たしているとみなせるためです。val が未定義の場合は、ro
-
Pythonで長さnのすべての上下反転数(Upside-Down Number)を生成する方法
ある値 n が与えられたとき、その桁数(長さ)を持つすべての「上下反転数(Upside-Down Number)」を求めることを考えます。上下反転数とは、180度回転させても同じように見える数字のことです。たとえば、入力が n = 2 の場合、出力は [11, 69, 88, 96] となります。上下反転数の仕組み180度回転しても成立する数字の組み合わせには、次のようなものがあります。0 → 0(そのまま)1 → 1(そのまま)8 → 8(そのまま)6 ↔ 9(互いに入れ替わる)これら以外の数字(2, 3, 4, 5, 7)は回転すると別の数字や無効な形になってしまうため使用できません。また
-
Pythonで与えられたリストが有効な状態かどうかをチェックするプログラム
問題の概要nums という数値のリストが与えられたとき、リスト内のすべての数字を次のいずれかのルールでグループ化できるかどうかを判定します。連続する2つの同じ数字からなるペア (a, a)連続する3つの同じ数字からなるトリプレット (a, a, a)連続する3つの連番からなるトリプレット (a, a+1, a+2)たとえば、入力が nums = [7, 7, 3, 4, 5] の場合、[7, 7] をペアとして、[3, 4, 5] を連番のトリプレットとしてそれぞれグループ化できるため、出力は True になります。解決のアプローチ:動的計画法(DP)この問題は、動的計画法を使うことで効率的に
-
PythonのSelenium WebDriverで特定要素のスクリーンショットを撮影する方法
Selenium WebDriverを使用すると、ページ全体ではなく、特定の要素だけを切り取った「部分的なスクリーンショット」を簡単に撮影できます。特定の要素のスクリーンショットを取得するには、まずid、name、class名などのロケーター(XPathやCSSセレクターなど)を使って、対象となるWeb要素を特定する必要があります。次に、そのWeb要素に対してscreenshot()メソッドを呼び出し、引数として拡張子付きの画像ファイル名を渡します。これにより、プロジェクトフォルダ内にその要素のスクリーンショットを含む新しい画像ファイルが作成されます。構文l=driver.find_eleme