-
PythonでNの桁の並べ替えがMの冪乗と一致するかを判定する方法
2つの正整数 n と m(2 ≤ n ≤ 1018、2 ≤ m ≤ n)が与えられたとします。この問題の目標は、数値 n の各桁を並べ替えてできる数(全桁の順列)の中に、m の冪乗と一致するものが存在するかどうかを調べることです。存在すれば「n の全桁の並べ替えのうち m の冪乗に等しいものがある」と答え、存在しなければその命題は偽と判断します。 具体例として、n = 7182、m = 12 のケースを考えてみましょう。1728 は 7182 の桁を並べ替えた数であり、さらに 1728 = 123 が成り立ちます。したがって、この場合は「n の全桁の並べ替えは m の冪乗と一致する」と判断でき
-
Pythonで色付きセルを含む正方形を2つの等しい部分に分割できるか判定する方法
サイズ n の正方形が与えられているとします。この正方形はさらに n² 個の単位サイズの小さな正方形(セル)に分割されており、そのうちの1つだけが特別な色で塗られています。ここで、この大きな正方形を2つの等しい部分に切り分けることを考えます。ただし、以下の条件を満たす必要があります。切断線が、色付きの小さな正方形と一切交わらないこと切り分けられた2つのピースが、互いに鏡像(鏡写し)の関係になっていることつまり、これらの条件を満たすような切り分けが可能かどうかを判定するのが課題です。入力としては、n の値と大きな正方形内における色付きセルの位置(行・列)が与えられます。例えば、size = 50
-
Pythonで配列を2つのサブ配列に分割し、合計の差が指定した数値になるか判定する方法
整数を要素とする配列「input_list」が与えられたとしましょう。この問題では、配列を2つの部分に分割したとき、それぞれの合計値の差が、あらかじめ指定された数値 n と一致するようにできるかどうかを判定します。たとえば、input_list = [9, 2, 5, 6]、n = 0 という入力が与えられた場合、出力は「Possible」になります。[9, 2] と [5, 6] に分割すれば、両方の合計が11となり、差がちょうど0になるためです。解決のアプローチこの問題は、次の手順で解くことができます。list_total に input_list の全要素の合計を代入する(list_to
-
Pythonで1回のスワップだけで配列をソートできるかどうかを判定する方法
整数要素を含む配列が与えられたとします。この配列に対して、スワップ(要素の入れ替え)操作をたった1回だけ実行できるという条件のもとで、配列の値を非減少順(昇順)に並べ替えることができるかどうかを調べる必要があります。可能であれば「Can be done(実行可能)」、不可能であれば「Cant be done(実行不可能)」と答えます。例えば、入力が input_list = [7, 8, 12, 10, 11, 9] の場合、出力は「Can be done」となります。これは、10 と 9 を入れ替えることで [7, 8, 9, 10, 11, 12] という昇順の配列にできるためです。解決の
-
Pythonで配列に連続した整数(重複可)が含まれているか判定する方法
はじめにPythonでは、数値の配列(リスト)に連続した整数が含まれているかどうかを判定したい場面があります。ここでの「連続」とは、要素が重複していてもよいものの、値そのものは途切れることなく並んでいる状態を指します。例えば、次のようなリストを考えてみましょう。nums = [6, 8, 8, 3, 3, 3, 5, 4, 4, 7]このリストには重複する要素が含まれていますが、ユニークな値を取り出すと 3, 4, 5, 6, 7, 8 となり、途切れのない連続した整数になっています。この場合、判定結果は True となります。解決のアプローチこの問題は、以下の手順でシンプルに解決できます。リ
-
Pythonで配列の要素が連続しているかどうかを判定する方法
数値の配列 nums が与えられたとき、その要素が連続した値(連番)になっているかどうかを判定する問題を考えてみましょう。 たとえば、入力が nums = [6, 8, 3, 5, 4, 7] の場合、要素を並べ替えると 3, 4, 5, 6, 7, 8 となり途切れがないため、出力は True になります。 解法のアプローチ この問題は、以下の手順で効率的に解くことができます。 配列のサイズが1未満の場合は False を返します。 配列の最小値 min_val と最大値 max_val を求めます。 (max_val - min_val + 1) が配列のサイズと一致しない場合、その範囲
-
Pythonで配列の要素が連続しているかどうかをO(n)時間・O(1)空間で判定する方法(負の数にも対応)
ソートされていない整数の配列 nums が与えられます。この配列の要素が「連続した値」(連続する整数列)になっているかどうかを判定します。ここでは、負の数が含まれる場合にも対応します。 たとえば、入力が nums = [-3, 5, 1, -2, -1, 0, 2, 4, 3] の場合、要素を昇順に並べると -3, -2, -1, 0, 1, 2, 3, 4, 5 となり、欠けなく連続しています。そのため、出力は True になります。 解法の考え方:等差数列の和の公式を利用 連続した整数の配列は、「最小値を初項、公差1とする等差数列」とみなすことができます。等差数列の和は次の公式で求められま
-
Pythonで3種類の操作を使って配列の合計をKにできるか判定する方法
問題概要数値のリスト nums と正の整数 K が与えられます。リストの各要素に対して、次の3つの操作のうちいずれかを1回だけ実行できます。その数値を負の値にする(符号を反転する)その数値にインデックス(1から始まる)を加算するその数値からインデックスを減算するすべての要素に操作を適用した後、配列の合計がちょうど k に等しくなるようにできるかどうかを判定するのが目的です。入力例たとえば、nums = [1,2,3,7]、k = 8 の場合を考えてみましょう。2番目の要素「2」からインデックス「2」を引き、3番目の要素「3」からインデックス「3」を引くと、配列は [1, 0, 0, 7] とな
-
Pythonで数値の2進表現が回文かどうかを判定する方法
ある整数 n が与えられたとき、その2進表現が回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを判定する方法を解説します。 例えば、入力が n = 9 の場合を考えてみましょう。9の2進表現は「1001」であり、これは回文であるため、出力は True になります。 解法のアプローチ この問題は、数値の2進表現をビット単位で反転し、元の数値と比較することで解けます。具体的な手順は以下の通りです。 ans を 0 で初期化する num が 0 より大きい間、次の処理を繰り返す ans を1ビット左シフトする(ans × 2 と同等) num が奇数(最下位ビットが1)なら、
-
Pythonで2つの数値のバイナリ表現がアナグラムかどうかを判定する方法
はじめに2つの整数 x と y が与えられたとき、それぞれのバイナリ(2進数)表現が互いにアナグラム(桁の並べ替え)の関係にあるかどうかを判定する方法を紹介します。例として、x = 9、y = 12 のケースを考えてみましょう。9 の2進表現は「1001」、12 の2進表現は「1100」です。「1001」の桁を入れ替えると「1100」と一致するため、この2つはアナグラムの関係にあり、結果は True になります。解決のアプローチこの問題は、とてもシンプルな考え方で解くことができます。2進表現を構成するのは「0」と「1」だけなので、両者に含まれる「1」の個数(セットビット数)を比較すればよいので
-
PythonでDFAを使って2進数文字列が3の倍数かどうかを判定する方法
はじめに ある数の2進表現を配列 n として受け取り、その値が3で割り切れるかどうかを「決定性有限オートマトン(DFA)」を使って判定する問題を考えてみましょう。 例えば、入力が n = [1, 1, 0, 0](10進数の12に相当)であれば、12は3の倍数なので出力は True になります。 DFAによるアプローチ この問題は、次のようなDFAを構築することで解けます。 考え方はシンプルです。ある数が3で割り切れるとき余りは0になり、割り切れない場合は余りが1または2になります。そこで、これら3つの余り(0・1・2)に対応する3つの状態を用意します。初期状態は余り0を表すため、同時に受理
-
Pythonで2つの数値の指定範囲のビットが互いに補完関係にあるか確認する方法
2つの数値 x と y、および範囲(left, right)が与えられたとき、両方の数値の left 桁目から right 桁目までのビットが互いに補完関係(反転)になっているかどうかを判定する必要があります。なお、ビット位置は右から左へ数え、最下位ビット(LSB)が1桁目として扱われます。例えば、入力が x = 41、y = 54、left = 2、right = 5 の場合、出力は True になります。41 と 54 の2進表現はそれぞれ 101001 と 110110 であり、2桁目から5桁目までのビットは「1001」と「0110」で、互いに補完関係にあるためです。解決のアプローチこの
-
Pythonで数値の2進表現における連続するセットビットの個数が昇順になっているかを判定する方法
問題概要 正の整数 n が与えられたとき、その2進表現(ビットパターン)の中に現れる「連続した1(セットビット)」の各グループの長さが、左から右へ向かって昇順(直前のグループより短くならない)になっているかどうかを判定する問題です。 具体例 例えば n = 1775 の場合、2進表現は 11011101111 となります。連続する1のグループは [2, 3, 4] であり、左から右へ増加しているため、結果は True になります。 一方、n = 13(2進表現: 1101)の場合、グループは [2, 1] となり後半が短くなるため、結果は False になります。 解法のアプローチ 数値を
-
Pythonで部分集合のビットごとのANDが2のべき乗になるかどうかを判定する方法
数値の配列 nums があるとします。このとき、ビットごとのAND(論理積)が2のべき乗となる部分集合が存在するかどうかを判定する必要があります。問題の例例えば、入力が nums = [22, 25, 9] の場合、出力は True になります。その理由は、部分集合 {22, 9} を2進数で表すと {10110, 1001} となり、この2つのANDを計算すると 10000 = 16 になり、16は2のべき乗(2⁴)だからです。解決のための手順この問題を解くために、以下のアルゴリズムに従います。MAX := 32 — 最大32ビットの整数を想定して定義します。関数 solve() を定義しま
-
Pythonで文字列の前半と後半が少なくとも1文字異なっているかどうかを判定する方法
小文字のみで構成された文字列が与えられたとき、その文字列を中央で分割して得られる2つの半分(前半と後半)の間に、少なくとも1文字の違いがあるかどうかを判定する問題を考えてみましょう。ここでの「違い」とは、含まれる文字が異なる場合もあれば、同じ文字でも出現回数(頻度)が異なる場合も含まれます。また、文字列の長さが奇数の場合は、中央の1文字を無視し、残りの文字だけで前半と後半を比較します。例えば、入力が s = helloohekk の場合を考えてみます。このとき前半は hello、後半は ohekk となり、両者は異なるため出力は True になります。解決のアプローチこの問題は、前半と後半それ
-
【Python】文字列を並べ替えて回文を作れるかどうかを判定する方法
問題の概要 文字列 s が与えられたとき、その文字を並べ替えることで回文(前から読んでも後ろから読んでも同じになる文字列)を作ることができるかどうかを判定します。 例えば、入力が s = raaecrc の場合、これを racecar という回文に並べ替えられるため、出力は True になります。 解決のアプローチ 文字を自由に並べ替えて回文を形成できる条件は、「奇数回出現する文字が最大1種類であること」です。これは次のように考えられます。 文字列の長さが偶数の場合:すべての文字が偶数回出現する必要があります。 文字列の長さが奇数の場合:ちょうど1つの文字だけが奇数回出現し、その文字が中央
-
Pythonで文字列の文字を入れ替えて別の文字列を作れるか判定する方法
2つの文字列 s と t が与えられたとき、s の文字を入れ替えることで t を作れるかどうかを判定する問題です。これはいわゆる「アナグラム(並べ替え)判定」の一種と言えます。例えば、入力が s = worldlloeh、t = helloworld の場合、出力は True になります。worldlloeh の文字を適切に入れ替えることで helloworld を作れるためです。解法のアプローチこの問題は、両方の文字列に含まれる各文字の出現回数を比較することで効率的に解けます。手順は以下の通りです。s_len := s の長さ、t_len := t の長さとするs_len と t_len が
-
Pythonで2つの括弧列の連結がバランスしているかどうかを判定する方法
問題の概要 「(」と「)」のみで構成された2つの括弧列 s と t が与えられたとき、それらを連結した文字列(s | t または t | s)がバランスの取れた括弧列になっているかどうかを判定します。 例えば、s = ()()))、t = ()(()( の場合、t | s の順序で連結すると ()(()(()())) となり、これは正しく対応の取れた括弧列であるため、出力は True になります。 解決のアプローチ この問題は、スタック(stack)を使った標準的な括弧チェックのアルゴリズムで解くことができます。手順は以下の通りです。 is_balanced_parenthesis() 関
-
Pythonで約数の個数が偶数か奇数かを判定する方法
ある整数 n が与えられたとき、その約数の総数が偶数か奇数かを判定することを考えます。 例えば、入力が n = 75 の場合を見てみましょう。75 の約数は [1, 3, 5, 15, 25, 75] の 6 個あるため、出力は「偶数(Even)」となります。 効率的な解法のポイント この問題は、シンプルかつ効率的なアプローチで解くことができます。鍵となるのは、次の数学的性質です。 「約数の個数が奇数になるのは、その数が完全平方数である場合のみ」 これは、約数が通常 d と n/d のペアで現れるためです。しかし、n が完全平方数の場合、√n は自分自身とペアになるため、約数の総数が奇数になり
-
Pythonで8進数の10進数表現が7で割り切れるかどうかを判定する方法
8進数で表された数値が与えられたとき、その10進数表現が7で割り切れるかどうかを判定する問題を考えてみましょう。例えば、入力が n = 61 の場合、出力は True になります。これは、8進数の61を10進数に変換すると 6×8 + 1 = 48 + 1 = 49 となり、49が7で割り切れるためです。解法のポイントこの問題を効率的に解く鍵となるのは、「8 ≡ 1 (mod 7)」という性質です。8進数の各桁は8のべき乗で重み付けされていますが、8のべき乗はすべて7で割ると1余るため、各桁の数字を単純に足し合わせた合計は、元の数値を7で割った余りと一致します。つまり、各桁の数字の合計が7で割