-
Pythonで文字列の接頭辞・接尾辞が回文かどうかを判定する方法
文字列 s が与えられたとき、その文字列の接頭辞(プレフィックス)および接尾辞(サフィックス)となる部分文字列が回文になっているかどうかを判定します。 たとえば、入力が s = levelishighforracecar の場合、接頭辞に「level」、接尾辞に「racecar」という回文がそれぞれ存在するため、出力は True になります。 解決の手順 この問題は、以下の手順で解くことができます。 l に文字列 s の長さを代入します。 i を 2 から l まで繰り返します。先頭からインデックス i までの部分文字列が回文であれば、ループを抜けます。 回文となる接頭辞が見つからなかった場
-
Pythonで2つの数の約数の合計が等しいかどうかを判定する方法
問題概要 2つの整数 p と q が与えられたとき、それぞれの約数の合計が一致しているかどうかを判定する方法を解説します。 例えば、p = 559、q = 703 という入力の場合、出力は True になります。これは、559 の約数が 1, 13, 43、703 の約数が 1, 19, 37 であり、それぞれの合計がどちらも 57 で一致するためです。 アルゴリズムの考え方 この問題を効率的に解くには、以下の手順に従います。 divSum() 関数を定義します。引数として n を受け取ります。 total を 1 で初期化し、i を 2 で初期化します。 i * i <= n を満
-
Pythonで行列のi行目とi列目の合計が一致するかどうかを判定する方法
問題概要2次元の行列(マトリックス)が与えられたとき、「i番目の行の合計」と「i番目の列の合計」が一致するかどうかを確認する問題です。例えば、次のような行列が入力として与えられたとします。23451064214671567この場合の出力は True になります。なぜなら、1行目の合計は (2 + 3 + 4 + 5) = 14、1列目の合計は (2 + 10 + 1 + 1) = 14 となり、両者が一致するからです。解決のための手順この問題は、以下の手順で解くことができます。行列の行数(row)と列数(col)を取得します。各行 i について、行の合計(total_row)と列の合計(tot
-
Python:指定されたインデックス間のスワップで配列をソートできるか判定する方法
問題概要0から n−1 までの一意な値を含む未ソートの配列 nums があるとします。さらに、配列の要素を入れ替えてよいインデックスのペアを格納した別の配列 pairs が与えられます。スワップは何度でも実行できます。このとき、許可されたスワップのみを使って配列を昇順に並べ替えることができるかどうかを判定するのが目的です。例えば、入力が nums = [6,1,7,3,0,5,4,2]、pairs = [(0,4),(6,0),(2,7)] の場合、出力は True になります。まず (2,7) をスワップして [6,1,2,3,0,5,4,7] とし、次に (6,0) をスワップして [4,
-
Pythonで配列に「他の要素の積と等しい値の要素」が存在するか判定する方法
「nums」という配列が与えられたとき、その配列の中に「それ以外のすべての要素の積と等しい値を持つ要素」が存在するかどうかを判定する問題を考えてみましょう。たとえば、入力が nums = [3,2,24,4,1] の場合、出力は True になります。これは、24 = 3 × 2 × 4 × 1 となり、要素 24 が他のすべての要素の積とちょうど一致しているためです。解決のアプローチこの問題は、次の手順で解くことができます。変数 mul を 1 で初期化します。配列のすべての要素を掛け合わせて、全体の積 mul を求めます。再度配列を走査し、各要素 nums[i] が mul / nums[
-
Pythonで配列内に「他の全要素の合計と等しい値」の要素が存在するか判定する方法
nums という名前の配列が与えられたとき、その配列の中に「残りのすべての要素の合計と等しい値を持つ要素」が存在するかどうかを判定する問題を考えてみましょう。例えば、入力が nums = [3,2,10,4,1] の場合、10 = (3 + 2 + 4 + 1) となるため、出力は True になります。解法のポイントある要素が他の要素の合計と等しいとき、その要素は必ず配列全体の合計の半分(total ÷ 2)になります。したがって、以下の手順で効率的に判定できます。freq := 要素の出現回数を記録する空の辞書(マップ)を用意total := 配列の合計値を格納する変数を 0 で初期化i
-
Pythonで配列が「美しい」かどうかを判定する方法
この記事では、ユニークな要素からなる配列 nums が与えられたときに、その配列が「美しい配列」と呼べる条件を満たしているかどうかを判定する方法を解説します。満たすべき条件は以下の2つです。すべての要素が 1 から n の範囲内に収まっていること配列が昇順にソートされていないことたとえば、入力が nums = [2,6,1,5,3,4] の場合、出力は True になります。これは、すべての要素が 1〜6 の範囲に存在し、かつ昇順に並んでいないためです。解法のアプローチこの問題は、次の手順で解くことができます。n := nums のサイズとするtotal := nums[0] で初期化するis
-
Pythonで数値の2進表現における0と1の連続ブロックの長さが等しいかどうかを判定する
問題の概要ある整数 num が与えられたとき、その2進表現を「連続した同じビットの並び(ブロック)」に分割し、0 のブロックと 1 のブロックの長さがすべて等しいかどうかを判定します。ただし、「0」そのものや、すべてのビットが「1」で構成される数値は、ブロック数の比較対象とはみなされません。例として、num = 455 の場合を考えてみましょう。455 の2進表現は 111000111 であり、「111」「000」「111」という3つのブロックに分けられます。各ブロックの長さはすべて 3 で等しいため、出力は True になります。解法の手順この問題は、以下の手順に従って解くことができます。b
-
【Python】O(1)の追加メモリで文字列内の英字が回文かどうかを判定する方法
はじめにプログラミングの問題の中には、余分なメモリ(追加スペース)を使わずに解くことが求められるものがあります。今回はその代表例として、「文字列に含まれる英字だけを抜き出したとき、それが回文(前から読んでも後ろから読んでも同じ文字列)になっているかどうかを、O(1)の追加スペースで判定する」方法を解説します。ここで扱う文字列 s には、小文字のアルファベットだけでなく、記号や数字も含まれる可能性があります。判定の対象となるのは英字のみで、それ以外の文字は無視します。問題の例たとえば、入力が次のような文字列だったとします。s = ra$5ce58carこの文字列から英字だけを取り出すと「race
-
Pythonで文字列がアルファベット順に並んでいるか判定する方法
文字列 s が与えられたとき、その文字がすべてアルファベット順(昇順)に並んでいるかどうかを判定します。 例えば、入力が s = mnnooop の場合、各文字は m → n → n → o → o → o → p というように昇順に並んでいるため、出力は True になります。 この問題を解くには、以下の手順に従います。 char_arr := 文字列 s を構成する各文字から新しいリストを作成する リスト char_arr を昇順にソートする ソート後の char_arr が元の文字列 s の文字リストと一致すれば true、一致しなければ false を返す 理解を深めるために、以
-
Pythonでスタックの要素がペアごとに連続しているかどうかを確認する方法
数値のスタックが与えられたとき、スタック内の値がペアごとに連続している(consecutive)かどうかを判定する問題を考えてみましょう。ここでいう「連続」とは、各ペアの2つの値の差がちょうど1であることを意味し、ペアは増加方向でも減少方向でも構いません。また、スタックの要素数が奇数の場合は、先頭(トップ)の要素はペアの対象外となります。さらに重要な点として、判定処理を行った後も元のスタックの内容を保持しておく必要があります。この問題を解くには、スタックに対して push(プッシュ)、pop(ポップ)、空かどうかの確認 の3つの基本操作のみを使用します。例えば、入力が stk = [5, 6,
-
【Python】桁の配列から最小の数を作り、先頭と末尾の桁でできる数が素数かどうか判定する方法
問題の概要 0〜9の数字だけを要素に持つ配列 digits が与えられます。まず、これらの桁をすべて使って作れる最小の数を求めます。次に、その数の先頭の桁と末尾の桁を組み合わせてできる2桁の数(順方向・逆方向の2通り)が素数かどうかを判定し、生成した数と素数の結果を出力します。 たとえば、入力が digits = [5, 2, 1, 7] の場合を考えてみましょう。桁を昇順に並べると最小の数は 1257 になります。先頭と末尾の桁は「1」と「7」なので、組み合わせは 17 と 71 の2つ。この2つはどちらも素数であるため、プログラムは 1257、17、71 を返します。 解法のアプローチ
-
Pythonで数値の各桁の出現頻度がすべて同じかどうかを判定する方法
ある整数 num が与えられたとき、その数値が「バランスしている」かどうかを判定する問題を考えてみましょう。ここで「バランスしている」とは、数値を構成するすべての桁(0〜9)の出現頻度が互いに等しいことを意味します。 たとえば、num = 562256 の場合、各桁は次のように出現します。 5 → 2回 6 → 2回 2 → 2回 すべての桁がちょうど2回ずつ現れているため、この場合の出力は True となります。 解決のアプローチ この問題は、以下の手順で解くことができます。 number: 数値 num を文字列に変換します。これにより各桁を簡単に走査できます。 freq: 各桁の出
-
Pythonで文字の出現頻度が文字列の長さの半分を超えているかどうかを確認する方法
ここでは、小文字・大文字・数字・特殊文字が混在する文字列 s が与えられたとき、いずれかの文字の出現頻度が文字列全体の長さの半分を超えているかどうかを判定する方法を解説します。たとえば、入力が s = CC*Ca5&CC の場合を考えてみましょう。この文字列の長さは 9 であり、文字 C の出現回数は 5 回です。5 > 9/2 が成り立つため、出力は True になります。解決のアプローチこの問題は、次の手順で解決できます。まず、文字列 s の各文字の出現頻度を格納したマップ(freq)を作成します。freq 内の各文字 ch について以下を繰り返します。ch の出現頻度が l
-
Pythonで配列の全要素をちょうどk回の操作でゼロにできるかどうかを判定する方法
配列 nums と整数 k が与えられたとき、次の操作をちょうど k 回実行することで、nums のすべての要素を 0 にできるかどうかを判定する問題を考えます。操作: nums 内の最小値を、nums のすべての非ゼロ要素から引く。例えば、入力が nums = [2, 2, 3, 5]、k = 3 の場合、出力は True になります。まず 2 を引いて配列は [0, 0, 1, 3] となり、次に 1 を引いて [0, 0, 0, 2]、さらに 2 を引けば [0, 0, 0, 0] となります。つまり、ちょうど 3 回の操作ですべての要素が 0 になったためです。解法のアプローチこの操作
-
Pythonで配列にある整数の約数がすべて含まれているか確認する方法
問題概要ある配列 nums が与えられたとき、この配列が「ある整数の約数」をすべて含んでいるかどうかを判定します。たとえば、入力が nums = [1, 2, 3, 4, 6, 8, 12, 24] の場合、これらはすべて 24 の約数であるため、出力は True になります。解法のアプローチこの問題は、次の手順で解くことができます。配列内の最大値を求めます。ある整数の約数リストには必ずその整数自身が含まれるため、配列が完全な約数リストなら、最大値が対象の整数になります。1 から最大値の平方根まで順に調べ、割り切れる数 i を見つけたら、i と商 maximum // i を一時リストに追加し
-
Pythonで数値が0と1のみで構成されているかどうかを判定する方法
はじめにある整数 num が与えられたとき、その数値が「0」と「1」のみで構成されているかどうかを判定する方法を解説します。例えば、入力が num = 101101 の場合、すべての桁が 0 か 1 なので、出力は True になります。一方、num = 102 のように 2 が含まれていれば、出力は False となります。解決のアプローチこの問題は、以下の手順で解くことができます。num の各桁の数字をすべて要素として持つ新しい集合(set)digits_set を作成するdigits_set から 0 を削除するdigits_set から 1 を削除するdigits_set のサイズが
-
Pythonで指定した数値がオーレ数(調和約数)かどうかを判定する方法
ある数 n が与えられたとき、それがオーレ数(Ore number)であるかどうかを判定する方法を解説します。オーレ数とは「約数の調和平均が整数になる数」のことで、「調和約数(harmonic divisor number)」とも呼ばれています。 オーレ数とは? たとえば入力が 28 の場合を考えてみましょう。28 の約数は次の 6 個あります。 [1, 2, 4, 7, 14, 28] これらの約数の調和平均は次のように計算できます。 調和平均 = 6 ÷ (1/1 + 1/2 + 1/4 + 1/7 + 1/14 + 1/28) = 6 ÷ 2 = 3 計算結果が整数の 3 になるため、
-
Pythonで配列の末尾に到達するのに数値Kが十分かどうかを判定する方法
配列 nums と整数 k が与えられたとき、特定の操作を繰り返しながら配列の末尾まで到達できるかどうかを判定する問題を考えてみましょう。 操作のルール 配列を先頭から順に走査し、以下のルールに従って処理を進めます。 現在の要素が素数でない場合: k の値を 1 減らします 現在の要素が素数の場合: k の値を初期値に戻します 具体例 例として、nums = [8, 5, 6, 7, 8]、k = 2 の場合の出力は True になります。処理の流れは以下の通りです。 nums[0] = 8 は素数ではないため、k = 1 になります nums[1] = 5 は素数なので、k は初期
-
Pythonで、ある円が2つの同心円の境界内に収まっているかどうかを判定する方法
半径 r1 と r2 を持つ2つの同心円があるとします。そこに、中心座標 coord と半径 r を持つもう1つの円を加えます。今回の課題は、この新しい円が、与えられた2つの同心円の間の境界領域内に完全に収まっているかどうかを判定することです。 たとえば、入力が r1 = 4、r2 = 2、coord = (3, 0)、r = 1 の場合、出力は True になります。 解法のアプローチ この問題は、点から原点までの距離を求める幾何学的な計算を使えば、シンプルに解決できます。手順は以下のとおりです。 まず、円の中心 (x, y) から原点までの距離 val を計算します。つまり、val =