-
【Python入門】リストの要素が回文かどうかを判定する方法
Pythonでは、数値や文字列のリストが回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを簡単に判定できます。 例えば、次のようなリストが与えられたとします。 nums = [10, 12, 15, 12, 10] この場合、前から読んでも後ろから読んでも 10, 12, 15, 12, 10 と同じ順序になるため、出力は True となります。 解決の手順 リストが回文かどうかを確認するには、以下の手順に従います。 変数 n にリストのサイズ(要素数)を代入する フラグ用の変数 is_palindrome を初期化する インデックス i を 0 で初期化する i が n
-
Pythonで行列上の爆弾ですべての敵を倒せるかどうかを判定する方法
ここでは、行列 mat が与えられたとき、そのセルには次の3種類の値が格納されているものとします。0: 空きエリア1: 爆弾2: 敵爆弾は、上下左右(水平・垂直方向)の一端からもう一端まで爆発して範囲内を破壊します。このとき、すべての敵が爆発によって倒されるかどうかを判定するのが本記事の目的です。問題の例たとえば、次のような入力が与えられたとします。0020010002000010この場合の出力は True になります。その理由は以下の通りです。位置 [1, 1] の爆弾が縦方向に爆発し、位置 [2, 1] の敵を倒します。位置 [3, 2] の爆弾が縦方向に爆発し、位置 [0, 2] の敵を
-
Pythonで特定の文字がすべて連続して出現しているかどうかを判定する方法
文字列 s とある文字 c が与えられたとき、c のすべての出現箇所が文字列内で連続しているかどうかを判定します。なお、c が文字列に存在しない場合も True を返すものとします。 例えば、入力が s = bbbbaaaaaaaccddd、c = a の場合、文字 a はすべてひと続きに出現しているため、出力は True になります。 解法のアプローチ この問題は、以下の手順で解くことができます。 フラグ flag を False で初期化し、インデックス index を 0 に設定します。 文字列の長さを n とします。 index が n 未満である間、以下を繰り返します。 stri
-
Pythonで2台の投票機に全員が時間内に投票できるか判定する方法
問題の概要n人の人と、同一仕様の2台の投票機があるとします。サイズnの配列timeが与えられ、time[i]はi番目の人が投票機で投票するのにかかる合計時間を表します。同じ瞬間に各投票機を使えるのは1人だけです。さらに、投票機が稼働し続けられる最大時間を表す値xが与えられます。このとき、すべての人が時間内に投票を済ませられるかどうかを判定するのがこの問題の目的です。たとえば、n = 3、x = 7、time = [3, 5, 3]という入力の場合、出力はTrueになります。時刻t0に0番目の人が1台目の投票機へ、1番目の人が2台目の投票機へ移動します。時刻t3で1台目が空くので、2番目の人が1
-
Pythonで数値のすべての部分数(サブナンバー)が一意の桁積を持つかどうかを判定する方法
ある数値 n が与えられたとき、その数値から作られるすべての部分数(サブナンバー)の桁積(digit product)が一意であるかどうかを確認する問題を考えてみましょう。 まず用語を整理します。部分数とは、元の数値の連続する桁を取り出してできる数値のことです。n 桁の数値には n×(n+1)/2 個の部分数が存在します。たとえば、135 の部分数は「1、3、5、13、35、135」の6つです。また、桁積とは、その数値を構成する各桁の数字をすべて掛け合わせた値を指します。 問題の例 入力が n = 235 の場合を考えてみます。このとき部分数は [2, 3, 5, 23, 35, 235] と
-
Pythonでバイナリ文字列内のすべての「1」が等間隔に並んでいるか判定する方法
バイナリ文字列 s が与えられたとき、文字列中のすべての「1」が等間隔(等距離)に配置されているかどうかを判定する問題です。言い換えると、隣接する任意の2つの「1」の間の距離がすべて同じである必要があります。なお、文字列には少なくとも2つの「1」が含まれているものとします。たとえば、入力が s = 100001000010000 の場合、「1」同士の間隔はいずれも4で一定であるため、出力は True になります。解法のアプローチこの問題は、以下の手順で解くことができます。「1」が出現する位置(インデックス)を格納するための新しいリスト index を用意します。i を 0 から文字列 s の長
-
Pythonで文字列内のすべての回文部分文字列が奇数長かどうかを判定する方法
問題の概要 文字列 s が与えられたとき、その中に含まれるすべての回文(palindrome)部分文字列の長さが奇数であるかどうかを判定します。偶数長の回文部分文字列がひとつでも存在すれば False を返し、存在しなければ True を返します。 例えば、s = levelopmadam の場合、回文部分文字列として level(5文字)と madam(5文字)があり、どちらも奇数長なので、出力は True になります。 解法のアプローチ 基本的な考え方は、文字列から取り得るすべての部分文字列を生成し、「長さが偶数で、かつ回文になっているもの」が存在するかどうかを順番にチェックしていくとい
-
Pythonで配列を合計がkで割り切れるペアに分割できるか判定する方法
数値の配列と整数 k が与えられたとき、配列全体を「各ペアの合計が k で割り切れる」ようなペアに分割できるかどうかを判定する問題を考えてみましょう。 たとえば、arr = [5, 15, 6, 9]、k = 7 という入力の場合、出力は True になります。(5, 9) の合計は 14、(15, 6) の合計は 21 であり、どちらも 7 で割り切れるからです。 解法の考え方:剰余に注目する この問題は、各要素を k で割った余り(剰余)に着目すると効率的に解けます。ポイントは次のとおりです。 合計が k で割り切れるペアは、「余りが r の要素」と「余りが k − r の要素」の組
-
Pythonで配列が指定範囲のすべての要素を含んでいるかどうかを判定する方法
nums という配列と、2つの整数 x、y があるとします。この2つの数値は範囲 [x, y] を定義しており、配列がこの範囲内のすべての要素を含んでいるかどうかを判定する必要があります。 たとえば、入力が nums = [5,8,9,6,3,2,4]、x = 2、y = 6 の場合、範囲内の要素 [2,3,4,5,6] がすべて配列に存在するため、出力は True になります。 解決のためのアプローチ この問題は、配列の要素の符号を反転させて「訪問済み」のマークとして利用することで、追加のメモリを使わずに効率的に解くことができます。手順は以下の通りです。 temp_range := y -
-
Pythonで配列が「ソート済みかつ回転」しているかを判定する方法
問題の概要 n個の一意な値で構成される配列があるとします。この配列が「昇順にソートされた状態から回転した配列」であるかどうかを判定してください。ただし、少なくとも1回の回転が必要なため、完全にソートされただけの配列は「ソートかつ回転」とはみなされません。 たとえば、入力が nums = [4,5,6,8,1,3] の場合、出力は True になります。この配列を2回回転すると [1, 3, 4, 5, 6, 8] という昇順の配列になるためです。 アルゴリズムの考え方 回転されたソート配列の最大の特徴は、最小値を境に配列が2つの昇順部分に分かれることです。この性質を利用して、以下の手順で判定
-
【Python】1と2のみを含む配列を合計が等しい2つの部分に分割できるか判定する方法
問題概要 1と2だけが格納された配列 nums が与えられます。この配列を、各部分の要素の合計が等しくなるように2つの部分へ分割できるかどうかを判定しましょう。 例えば、入力が nums = [1, 1, 2, 2, 2] の場合、[1, 1, 2] と [2, 2] のように分割できます。それぞれの合計は4で等しいため、出力は True となります。 解法のアプローチ この問題は、配列全体の合計と「1」の個数に着目することで、線形時間で効率的に解けます。手順は以下の通りです。 配列全体の合計 total を求めます。 total が奇数の場合、2つの部分で同じ合計にすることは不可能なので
-
Pythonで配列が二分探索木(BST)の中間順巡回を表しているかどうかを判定する方法
数値の配列 nums が与えられたとき、その配列がある二分探索木(Binary Search Tree)を中間順巡回(inorder traversal)した結果と一致する順序で要素を保持しているかどうかを判定します。例えば、入力が nums = [5, 8, 15, 18, 20, 26, 39] の場合、この配列は以下の二分探索木を中間順巡回した結果と一致するため、出力は True になります。解法のポイントここで重要な性質があります。それは、二分探索木を中間順巡回すると、必ず昇順にソートされた要素列が得られるというものです。したがって、この問題は「配列が昇順に並んでいるかどうかを確認する
-
Pythonでエンコーディングが一意のバイナリ文字列を表すかどうかを確認する方法
問題の概要サイズkのバイナリ文字列のエンコーディングを表す配列numsが与えられたとします。このとき、指定されたエンコーディングが一意にバイナリ文字列を特定できるかどうかを確認する必要があります。ここでいうエンコーディングとは、「連続する1の個数」を要素とし、それぞれのブロックが単一の0で区切られている形式を指します。例えば、入力がnums = [4, 2, 3]、k = 11の場合を考えてみましょう。このエンコーディングは「4個の1」「0」「2個の1」「0」「3個の1」という並びを意味します。つまり、対応するバイナリ文字列は「11110110111」となり、その長さはちょうど11(k)です。
-
Pythonで整数が2つの半素数の合計として表現できるかどうかを判定する方法
この記事では、ある整数 n が与えられたとき、それを2つの半素数(セミプライム)の合計として表現できるかどうかをPythonで判定する方法を解説します。半素数とは?半素数とは、2つの素数の積として表現できる数のことです。1〜100の範囲に含まれる半素数は次の通りです。4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95具体例たとえば入力が n = 108 の場合、出力は True になり
-
Pythonで文字列のアナグラムが回文になるかどうかを判定する方法
文字列 s が与えられたとき、その文字列のアナグラム(並べ替え)の中に回文となるものが存在するかどうかを判定する問題を考えてみましょう。例えば、入力が s = aarcrec の場合、この文字列を並べ替えると racecar という回文を作ることができるため、出力は True になります。解法の考え方回文の重要な性質として、「各文字の出現回数のうち、奇数回出現する文字は最大でも1種類まで」というルールがあります。これは、回文では左半分と右半分が鏡像の関係になるためです。偶数長の回文:すべての文字が偶数回出現する奇数長の回文:ちょうど1つの文字だけが奇数回出現し、それが中央に配置されるしたがって
-
Pythonでいずれかの区間が他の区間に完全に重複しているかどうかを判定する方法
問題の概要あるイベントの集合について、各区間は開始時刻 a と終了時刻 b のペア (a, b) として表されます。ここでの課題は、与えられた区間の中に「ある区間が別の区間を完全に覆ってしまう(=別の区間に丸ごと含まれる)」ような組み合わせが存在するかどうかを判定することです。完全な重なりが1つでも見つかれば True を、存在しなければ False を返します。たとえば、入力が [(4,6), (10,12), (7,9), (13,16)] の場合は、どの区間も他の区間を完全には包含しないため出力は False になります。一方、入力が [(4,6), (4,9), (7,11), (5,
-
Pythonで数値が17で割り切れるかどうかを判定する方法
ある数値が与えられたとき、その数値が17で割り切れるかどうかを判定する必要があるとします。例えば、入力が 99943 の場合、出力は「Divisible(割り切れる)」となります。解法のアプローチ:繰り返し減算法この問題は「繰り返し減算法」と呼ばれる手法で解くことができます。具体的には、数値の末尾の桁を取り出し、残りの数値から「末尾の桁 × 5」を引くという操作を、数値が2桁になるまで繰り返します。最終的に得られた2桁の数値が17で割り切れるなら、元の数値も17で割り切れることになります。この方法が成り立つ理由は、数値を「10a + b」(aは末尾の桁を除いた部分、bは末尾の桁)と表したとき、
-
Pythonで数値が19で割り切れるかどうかを判定する方法
非常に大きな数値が与えられたとき、その数値が19で割り切れるかどうかを判定したいケースがあります。 例えば、入力が 86982 の場合、出力は「Divisible(割り切れる)」となります。 アルゴリズムの考え方:繰り返し加算法 この問題は「繰り返し加算法」と呼ばれる手法で解くことができます。この方法では、数値から末尾の1桁を取り出し、それを2倍した結果を残りの数値に加えるという操作を、数値が2桁になるまで繰り返します。そして最終的に得られた2桁の数値が19で割り切れるかどうかを調べます。 具体的な手順 数値が100以上である間(number // 100 が0でない間)、次の処理を繰り返し
-
Pythonで巨大な数の順列が8で割り切れるかどうかを判定する方法
桁数が非常に多い巨大な数が文字列として与えられたとき、その数字を並べ替えてできる順列の中に8で割り切れるものが存在するかを判定する問題を考えてみましょう。 例えば、入力が input_num = 4696984 の場合、出力は「Divisible by eight(8で割り切れる)」となります。 解法のカギ:8の倍数の判定ルール この問題を効率よく解くための重要なポイントは、次の数学的な性質です。 ある整数が8で割り切れる ⇔ その下3桁(末尾3桁)だけでできた数が8で割り切れる これは、1000 = 125 × 8 と8の倍数であるため、下3桁より上の部分は必ず8の倍数になるからです。つま
-
Pythonで数値の順列が3の倍数かつ回文になるかを判定する方法
はじめに 大きな正整数 N が与えられたとき、その数字を並べ替えてできる数(順列)の中に、「回文(逆から読んでも同じ数)」であり、かつ「3で割り切れる」ものが存在するかどうかを判定する問題を考えてみましょう。 例えば、132213 という数が与えられたとします。この数字を並べ替えると 123321 が作れます。123321 は回文であり、同時に3でも割り切れます。したがって、入力が 132213 の場合、出力は「1つ以上の順列が回文であり、3で割り切れる」となります。 解法の考え方 すべての順列を実際に生成して1つずつ確認するのは、桁数が大きくなると非現実的です。そこで、次の2つの数学的な性質