-
Pythonで数値が2の累乗かどうかを判定する方法
プログラミングでは、ある正の整数が2の累乗(べき乗)であるかどうかを判定したい場面がよくあります。例えば、1024は 210 なので2の累乗ですが、1000は2の累乗ではありません。この記事では、Pythonを使って数値が2の累乗かどうかを判定するシンプルなアルゴリズムを紹介します。判定の考え方2の累乗には重要な性質があります。それは、2で繰り返し割り続けると、最終的に必ず1になるという点です。1024 ÷ 2 = 512512 ÷ 2 = 256256 ÷ 2 = 128…(中略)…4 ÷ 2 = 2、2 ÷ 2 = 1一方、2の累乗ではない数(例えば6など)を2で割り続けると、最終的に1に
-
Pythonで3進数の文字列を10進整数に変換する方法
3進数を10進数に変換するとはここでは、3進数(使用できる数字は0、1、2のみ)で表された数値を文字列 s として受け取り、それに対応する10進数の整数を求める方法を解説します。例えば、入力が 10122 の場合、出力は 98 になります。アルゴリズムの考え方この問題は、各桁を左から順に処理していくことで解決できます。手順は以下の通りです。答えを格納する変数 ans を 0 で初期化します。文字列 s の各桁 c について、次の計算を繰り返します。ans := 3 * ans + cすべての桁を処理し終えたら、ans を返します。この「左の桁から順に3倍して足していく」手法は、任意の進数を10
-
Pythonで行列内の「ラッキーナンバー」(行と列の両方で最大の数)を数える方法
問題の概要 ある行列(マトリックス)が与えられたとき、「その行においても、その列においても最も大きい値になっている整数」がいくつあるかを求める問題です。このような数字は「ラッキーナンバー(Lucky Number)」とも呼ばれます。 例として、次のような入力を考えてみましょう。 132465157 この場合、答えは 2 になります。条件を満たすのは 6 と 7 の2つだけだからです。 6: 2行目(4, 6, 5)の最大値であり、同時に2列目(3, 6, 5)の最大値でもある 7: 3行目(1, 5, 7)の最大値であり、同時に3列目(2, 5, 7)の最大値でもある 解き方のアプローチ
-
Pythonで解く「ボブのゲーム」:全要素を偶数にする最小ターン数を求めるアルゴリズム
ボブのゲーム問題とは友人のボブは、自分一人で次のようなゲームを楽しんでいます。まず、整数のリスト nums を用意します。各ターンで、ボブはリストから2つの要素を選び、それらを「選んだ2つの数の合計と等しい1つの正の整数」に置き換えます。そして、配列内のすべての数が偶数になった時点で勝利を宣言できるというルールです。本記事では、ボブが勝利を宣言するまでに必要な最小ターン数を求める方法を解説します。なお、どのように操作してもすべてを偶数にできない場合は -1 を返します。具体例入力が [2, 3, 4, 9, 7, 13] の場合を考えてみましょう。このときの出力は 2 になります。手順は次のと
-
Pythonでページネーション(ページ送り)を実装する方法
本記事では、Pythonを使ってページネーション(ページ分割)の処理を実装する方法を解説します。リストから指定したページに該当する要素だけを取り出す、シンプルかつ実用的なテクニックを学びましょう。 問題の概要 文字列のリスト「book」が与えられているとします。ここに、ページ番号 page(0始まりのインデックス)と、1ページあたりの項目数 page_size を指定すると、そのページに表示される単語のリストを返す必要があります。もし指定されたページが範囲外であれば、空のリストを返すものとします。 例として、以下のような入力を考えてみます。 book = [hello, world, pro
-
Pythonで挑むボス戦アルゴリズム:戦闘員とボスの戦力を判定して勝敗行をふるい分ける方法
問題の概要0と1だけで構成されたリスト fighters(戦闘員)と、同じく0と1からなる二次元リスト(行列)bosses(ボス)が与えられます。fighters内の「1」は戦闘員1人を表し、bossesの各行に含まれる「1」はその行にいるボスを表します。戦闘員たちがあるボスの行に勝てるのは、戦闘員の総数がその行のボスの数より多い場合です。つまり、勝てない(倒しきれない)行だけを残し、撃破されたボスの行を取り除いた新しい bosses の行列を返すのがこの問題の目的です。入力例たとえば、fighters = [0, 1, 1](戦闘員は2人)で、bosses が次のような行列だったとします。0
-
Pythonで予算内に購入できる車の最大台数を求める方法
問題の概要 販売中の車の価格リストと予算 k が与えられたとき、その予算内で購入できる車の最大台数を求める問題を考えます。 例えば、価格リストが [80, 20, 10, 30, 80]、予算が 85 の場合、出力は 3 になります。これは、価格 10・20・30 の3台を購入すると合計 60 となり、予算内に収まるためです。 解き方(アルゴリズム) この問題は貪欲法(グリーディ法)を使うことで効率的に解けます。「同じ予算でできるだけ多くの車を買うなら、安い車から順に購入すればよい」というシンプルな発想です。 具体的な手順は以下の通りです。 カウンター count を 0 で初期化します
-
Pythonでシーザー暗号を実装する方法:文字列をk文字シフトするアルゴリズム解説
シーザー暗号は、古典的な暗号方式の一つで、各文字をアルファベット上で一定数だけずらして変換します。本記事では、小文字のアルファベット文字列 s とオフセット値 k を受け取り、s 内のすべての文字をアルファベット順に k 文字分後ろへずらした文字列を生成する方法を、Pythonのコード例とともに解説します。シーザー暗号の仕組み例えば、入力が hello、k = 3 の場合、各文字が3つずつ後ろにずらされるため、出力は khoor になります。ここで注意すべき点は、文字が z を超えて溢れた場合(あるいは逆方向にシフトして a より前になった場合)には、アルファベットの反対側に折り返す(ラップア
-
Pythonで単語リストをキャメルケース(camelCase)に変換する方法
キャメルケースとは キャメルケース(camelCase)は、複数の単語をつなげて1つの識別子を作るための命名規則の一つです。最初の単語は先頭が小文字で始まり、2つ目以降の単語は先頭が大文字になります。たとえば「hello world」は「helloWorld」と表記されます。Pythonでは変数名や関数名の命名によく使われるスタイルです。 本記事では、単語のリストを受け取り、それらをキャメルケース形式で連結する方法を解説します。 たとえば、入力が [Hello, World, Python, Programming] の場合、出力は「helloWorldPythonProgramming」にな
-
Pythonで解く細胞融合問題 ― heapqを使った効率的なアルゴリズム実装
問題の概要数値のリスト cells があるとします。このリストは、さまざまな細胞のサイズを表しています。各反復処理において、最も大きい2つの細胞 a と b が次のルールに従って相互作用します。a = b の場合: 両方の細胞は死滅します。a ≠ b の場合: 2つの細胞は融合し、新しいサイズは floor((a + b) / 3)(小数点以下切り捨て)になります。最終的に残った細胞のサイズを求めてください。すべての細胞が消滅した場合は -1 を返します。具体例入力が [20, 40, 40, 30] の場合、出力は 16 になります。1回目の反復:最大の2つである 40 と 40 は等しいた
-
Pythonで数値リストの方向転換(傾きの変化)回数を求める方法
問題概要 nums という数値のリストが与えられたとき、隣り合う要素間の傾きが「正から負」または「負から正」へと切り替わる回数(方向転換の回数)を求めることを考えます。 例えば、入力が [2, 4, 10, 18, 6, 11, 13] の場合、出力は 2 になります。これは、10 の位置で増加から減少へ(正から負へ)、その後 6 の位置で減少から増加へ(負から正へ)と方向が変わるためです。 解法のアプローチ この問題は、リストの各要素が「山」(極大値)または「谷」(極小値)に該当するかどうかを順番に調べることで解決できます。手順は以下の通りです。 インデックス i を 1 から nums
-
【Python入門】リストの一意な値ごとにIDを割り当てる2つの方法
Pythonでリストを扱っていると、各要素を一意に識別したい場面が出てきます。たとえば、データのカテゴリ化やラベルエンコーディングなどでは、同じ値には同じIDを、異なる値には異なるIDを割り当てる必要があります。本記事では、リスト内の重複する要素に対して同じIDを割り当て、一意な値ごとに連番のIDを振る方法を、2つのアプローチでわかりやすく解説します。方法1:enumerate()とOrderedDict.fromkeys()を組み合わせるまず紹介するのは、enumerate()関数とOrderedDict.fromkeys()を組み合わせる方法です。enumerate()は、リストの各要素に
-
Pythonでリストの要素に一意のIDを割り当てる方法
プログラミングをしていると、リスト内の各要素を一意に識別したい場面が多くあります。そのためには、リスト内の各要素に対して一意のIDを割り当てる必要があります。Pythonでは、組み込み関数や標準ライブラリを活用することで、この処理をシンプルに実現できます。本記事では、2つの代表的なアプローチをサンプルコード付きで紹介します。enumerateとsetを使う方法enumerate関数は、各要素に一意の番号(インデックス)を割り当てるのに便利です。しかし、リストに重複した要素が含まれている場合は、まずset関数でユニークな値だけを抽出し、辞書型のキーと値のペアを作成してから、元のリストの各要素に対
-
Pythonでリスト内の一意なサブリストの数を数える方法
Pythonのリストには、サブリスト(ネストされたリスト)を含めることができます。サブリストとは、より大きなリストの中に格納されたリストのことです。本記事では、指定されたリスト内に存在する一意なサブリストの数を数える方法を、具体的なコード例とともに解説します。Counterを使う方法collections.Counterは辞書型(dict)のサブクラスで、要素とその出現回数を追跡するために使用されます。要素が辞書のキーとして保存され、その出現回数が値として格納される順序なしコレクションとして扱われます。以下の例では、サブリストを含むリストに対して直接Counterを適用しています。コード例fr
-
Pythonで辞書のキーをリストとして取得する3つの方法
Pythonプログラミングにおいて、辞書(dict)からキーだけを取り出してリストとして扱いたい場面は非常に多くあります。例えば、キーの一覧を使って別の処理を行ったり、ループ処理の入力データとして利用したりするケースです。本記事では、辞書のキーをリスト形式で取得する代表的な3つの方法を、サンプルコードと実行結果とともにわかりやすく解説します。方法1:dict.keys() を使う最も直接的で一般的なのが、辞書組み込みメソッドの keys() を使う方法です。keys() は辞書のすべてのキーを含むビューオブジェクトを返すため、それを list() で囲むことでリストに変換できます。サンプルコー
-
Pythonでリストの最初と最後の要素を取得する3つの方法
Pythonでリストを扱っていると、「先頭の要素」と「末尾の要素」だけを取り出したい場面に遭遇することがあります。リストの長さを意識しながらインデックスを操作する必要があるため、一見すると少し手間に感じるかもしれません。ここでは、誰でもすぐに使える代表的な3つのアプローチを、コード例と実行結果つきでわかりやすく解説します。いずれの方法もリストのインデックスを活用したものです。方法1:インデックスを直接指定するPythonのリストでは、最初の要素には必ずインデックス「0」が割り当てられ、さらに負のインデックス「-1」を使えば最後の要素を参照できます。この仕様をそのまま利用すれば、追加の処理なしで
-
Pythonでネストされたリスト(サブリスト)から各先頭要素を取り出す3つの方法
Pythonでは、リストの要素としてさらにリストを含めることができます。このように入れ子になったリストは「サブリスト(ネストされたリスト)」と呼ばれます。本記事では、与えられたリストに含まれる各サブリストから「最初の要素」だけを取り出す方法を、3つのアプローチで解説します。 方法1:forループを使う 最もシンプルで直感的なのがforループを使う方法です。外側のリストを順番に走査し、各サブリストのインデックス0の要素を取得します。コードが読みやすく、初心者にも理解しやすいのが特徴です。 サンプルコード Alist = [[Mon, 1], [Tue, Wed, Fri], [12,3,7]]
-
Pythonで各サブリストの最後の要素を取得する3つの方法
Pythonでは、リストの中にさらにリストを要素として持つことができます。このようにネストされたリストは「サブリスト」と呼ばれます。本記事では、与えられたリストから各サブリストの最後の要素だけを取り出す方法を、3つの異なるアプローチで解説します。方法1: forループを使うもっともシンプルなのがforループを使う方法です。リスト内の各サブリストを順番に処理し、Pythonの負のインデックス -1 を指定することで、末尾の要素を簡単に取得できます。コード例Alist = [[Mon, 1], [Tue, Wed, Fri], [12, 3, 7]] print(Given List:\n, Al
-
Pythonでリストから一意の値(重複しない要素)を抽出する3つの方法
Pythonのリストは、[](角括弧)の中に複数の要素を格納できるデータ構造です。異なるデータ型を混在させることもでき、重複した値を含むこともあります。本記事では、リストから重複を除いた一意の値だけを取り出す方法を、代表的な3つのアプローチに分けて解説します。方法1:append() と not in を使う方法まず空の新しいリストを作成し、元のリストの要素を1つずつ確認しながら、まだ新しいリストに存在しない場合のみ追加していく方法です。forループと not in 条件を組み合わせることで、要素の存在チェックを行い、未登録の要素だけを追加できます。コード例def catch_unique(l
-
Pythonで文字列を指定サイズ(N文字)ごとに分割する方法
問題の概要 文字列 s と整数 n が与えられたとき、s を n 文字ずつの部分文字列に分割することを考えます。 例えば、入力が s = abcdefghijklmn、n = 4 の場合、出力は [abcd, efgh, ijkl, mn] となります。最後の断片が n 文字に満たない場合でも、残りの文字列がそのまま出力される点に注意してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 インデックス i を 0 で初期化します。 結果を格納するための空のリスト f を用意します。 i が文字列の長さ未満である間、次の処理を繰り返します。 s[i : i+n](イ