-
Pythonの文字列データからPandasでDataFrameを構築する方法
本記事では、文字列型のデータを使ってpandasのDataFrameを構築する方法を解説します。pandasは通常、CSVファイルの読み込みに使われることが多いですが、実はファイルではなく文字列データからも同じようにDataFrameを作成できます。その際に活用するのが、Python標準ライブラリのioモジュールが提供するStringIOです。StringIOは文字列をファイルのように扱えるラッパーであり、これを使うことで、あたかもCSVリーダーからデータを読み込んでいるかのように処理できます。ここでは、各項目がセミコロン(;)で区切られた文字列データを例に、DataFrameの作成手順を見て
-
Pythonで指定したサイズ・合計・要素の上限を満たす重複なし配列を作成する方法
問題の概要サイズを表す変数 N、配列内の全要素の合計を表す変数 SUM、そして「どの要素も K を超えてはならない」という上限を表す変数 K が与えられます。このとき、すべての要素が互いに異なる配列を見つけるのが目的です。条件を満たす配列が存在しない場合は -1 を返します。例として、N = 4、SUM = 16、K = 9 が入力された場合、出力は [1, 2, 4, 9] となります。この配列は要素数が4、合計が16、最大値が9以下であり、すべての要素が重複なく並んでいます。解法のアプローチこの問題は、「理論上の最小合計・最大合計による実現可能性の判定」と「貪欲法(グリーディ法)による配列
-
Pythonで共通ノードを持つ2つのソート済み連結リストから最大合計パスのリストを作成する方法
ソート済みの連結リストが2つ与えられたとき、開始ノードから終了ノードまでの合計値が最大となるパスで構成される連結リストを作成することを考えます。最終的なリストには、両方の入力リストのノードが含まれる可能性があります。結果のリストを作成する際、あるリストから別のリストへ切り替えられるのは、交点(両方のリストに同じ値を持つノード)の位置のみです。また、この問題は定数の追加メモリ(定数空間)で解く必要があります。例えば、入力が [6,8,35,95,115,125] と [5,8,17,37,95,105,125,135] の場合、出力は [6,8,17,37,95,115,125,135] となり
-
【Python】整数配列の全要素とのXOR合計が最小になる数Xの求め方
整数の配列 A が与えられたとき、(A[0] XOR X) + (A[1] XOR X) + … + (A[n−1] XOR X) の合計が最小になるような数 X を求めることを考えます。 たとえば、入力が [3, 4, 5, 6, 7] の場合、答えは X = 7、Sum = 10 となります。 解法のアプローチ:ビットごとに考える この問題は、各ビット位置を独立に評価するという発想で効率的に解けます。XOR は対応するビットが異なるときだけ 1 を返すため、あるビット位置で配列内の半数より多くの要素が 1 を持っているなら、X のそのビットを 1 にすることで多数派のビットを 0 に反転さ
-
Pythonで2つの文字列の間に存在する辞書順の文字列を見つける方法
問題の概要 2つの文字列 S と T が与えられたとき、S より辞書順で大きく、T より辞書順で小さい同じ長さの文字列が存在するかどうかを判定します。該当する文字列が存在しない場合は -1 を返します。 たとえば、入力が S = bbb、T = ddd の場合、出力は bbc となります。bbb の直後に辞書順で来る文字列は bbc であり、これは ddd よりも小さいためです。 辞書順の定義 S = S1S2…Sn があるインデックス i について S1 = T1, S2 = T2, …, Si-1 = Ti-1, Si < Ti を満たすとき、S は T = T1T2…Tn より辞書
-
Pythonで配列内の1つの要素を除くすべての約数となる整数を見つける方法
問題の概要 数値の配列が与えられたとき、その中のちょうど1つの要素を除いた残りのすべての要素の約数となる整数Bを見つける問題です。ただし、配列内の全要素のGCD(最大公約数)は1ではないものとします。 たとえば、入力が {8, 16, 4, 24} の場合、出力は 8 になります。8は4以外のすべての要素(8・16・24)を割り切れる一方、4だけは割り切れないためです。 解法のアプローチ:累積GCDの活用 この問題は、プレフィックスGCD(前方からの累積最大公約数)とサフィックスGCD(後方からの累積最大公約数)を組み合わせることで効率的に解けます。 ある要素 i を除外した残り全体のGCD
-
Pythonで1桁を「3」に変更して作れる最大の数を求める方法
問題概要 1、2、3 のみで構成された整数 n が与えられるとします。ここで、どれか1桁を「3」に変更できる場合、作成できる最大の数を求めます。 例えば、入力が 11332 の場合、先頭の「1」を「3」に変更することで、出力は 31332 となります。 解法のアプローチ この問題は貪欲法(グリーディ法)で効率よく解くことができます。数を最大化するためには、位取りの重みが最も大きい左側(上位)の桁から順に確認し、最初に見つかった「3」以外の数字を「3」に変更するのが最適です。 具体的な手順は以下の通りです。 n を文字列化し、各桁を要素とするリスト li を作成します。 x を 0 からリ
-
Pythonで12時間制の時刻を24時間制に変換する方法
はじめにプログラミングでは、12時間制(am/pm)で表された時刻を24時間制に変換する処理が必要になることがあります。本記事では、Pythonを使って「08:40pm」のような12時間制の時刻文字列を、「20:40」のような24時間制の表記へ変換する方法を解説します。問題の概要例えば、入力として 08:40pm という文字列が与えられた場合、出力は 20:40 となります。午後(pm)の時刻には12時間を加算し、午前(am)の場合はそのままの値を使用します。解決の手順この問題は、以下の手順で解くことができます。時(hour)の取得: 文字列の先頭2文字(インデックス0〜1)を整数に変換し、1
-
Pythonで3-6-9ゲームを実装する方法を解説
3-6-9ゲームとは? 「3-6-9ゲーム」は、韓国や日本で古くから親しまれている拍手遊びです。3の倍数、または数字に3・6・9が含まれるときに拍手(clap)をするルールが有名ですね。この記事では、そのルールをPythonのプログラムで実装する方法を解説します。 問題の定義 数値 n が与えられたとき、1からnまでの各数値を要素とするリストを作成します。ただし、以下の条件に当てはまる数値は文字列 clap に置き換えます。 その数値が3の倍数である その数値に「3」「6」「9」のいずれかが含まれている 例えば、入力が 20 の場合、出力は次のようになります。 [1, 2, clap,
-
Pythonで3の倍数と7の倍数の組み合わせで数値nを作れるか判定する方法
ある正の整数 n が与えられたとき、その n を「3の非負の倍数」と「7の非負の倍数」の合計として表すことができるかどうかを判定する問題を考えてみましょう。例えば、入力が 13 の場合、出力は True になります。なぜなら、13 = 1×7 + 2×3 と表せるからです。解法のアプローチこの問題は、次の手順で解くことができます。i を 0 から n+1 まで、7 ずつ増やしながら繰り返します。各 i について、(n − i) が 3 で割り切れるかどうかを確認します。割り切れる場合は True を返します。ループを最後まで回っても条件を満たさなかった場合は、False を返します。このアルゴ
-
Pythonで解く!エコモード搭載スマホのバッテリー残り時間を計算する方法
問題の概要 ここでは、「エコモード」を備えたスマートフォンを題材にしたプログラミング問題を考えてみましょう。このモードは、バッテリー残量が20%まで下がると自動的に有効になり、エコモード中は通常モードの2倍ゆっくりとバッテリーが消耗します。 家を出発した時点では、バッテリー残量はちょうど100%でした。そして、t分後には残りp%になっていたとします。このとき、スマートフォンの電源が完全に切れるまで、あと何分使用できるかを求めるのがこの問題です。 たとえば、入力が t = 75、p = 25 だった場合、出力は 45 となります。 解法のアプローチ ポイントは、観測された残量 p が 20%
-
Pythonで文字列から頭字語(アクロニム)を生成する方法
プログラミングでは、フレーズを表す文字列から頭字語(アクロニム)を作成したい場面がよくあります。本記事では、Pythonを使って文字列から頭字語を生成するシンプルなアルゴリズムを解説します。 問題の概要 あるフレーズを表す文字列 s が与えられたとき、その頭字語を求めます。生成される頭字語は以下の条件を満たす必要があります。 すべて大文字にすること 「and」という単語は含めないこと たとえば、入力が Indian Space Research Organisation の場合、出力は ISRO となります。 解決の手順 この問題は、次のステップで解くことができます。 トー
-
Pythonで12時間形式の時刻に分を追加する方法
ここでは、am または pm の接尾辞が付いた12時間制の時刻を表す文字列と、整数 n が与えられた場合に、その時刻へ n 分を加算し、同じ形式で新しい時刻を返す方法を解説します。 例えば、入力が s = 8:20pm、n = 150 の場合、出力は 10:50pm になります。 解決の手順 この問題を解くために、以下の手順に従います。 h, m: 文字列 s から「時」と「分」の部分を取り出します h: h を 12 で割った余りに置き換えます(h mod 12) 時刻 s が pm の場合は、h に 12 を加算します(24時間表現へ変換) t: h × 60 + m + n を計算し
-
Pythonでリスト形式の数値に1を加算する方法
問題概要整数のリスト n が与えられ、これが10進数の数値を表しているとします。各要素 n[i] は 0〜9 の範囲にあります。例えば、n = [2, 4, 9] は数値 249 を表します。このリストと同じ形式で、元の数値に1を加えた結果を返すことが求められます。例えば、入力が n = [9, 9] の場合、99 + 1 = 100 となるため、出力は [1, 0, 0] になります。解法のアプローチこの問題は、次の手順で解くことができます。リスト n の先頭に 0 を追加します(桁上がりへの備え)最後の要素に1を加えますリストの末尾から先頭に向かって処理を行い、10以上の値があれば繰り上げ
-
Pythonでアナグラムかどうかを判定する方法
2つの文字列 s0 と s1 が与えられたとき、それらが互いにアナグラムであるかどうかを判定する問題について解説します。アナグラムとは、一方の文字列に含まれる文字を並べ替えることで、もう一方の文字列と完全に一致させることができる関係のことです。 例えば、入力が s0 = listen、s1 = silent の場合、「listen」の文字を並べ替えると「silent」となるため、出力は True になります。 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 s0 と s1 のそれぞれの文字をソートする ソート後の文字列同士を比較する 両者が一致すれば True を
-
Pythonで解く「古代宇宙飛行士の辞書」問題 ― 文字列が独自の辞書順に並んでいるか判定する
今回は、「古代宇宙飛行士の辞書(astro_dict)」と呼ばれる独自の文字順序に基づき、与えられた文字列 s がその辞書順に従って正しく並んでいるかどうかを判定する方法を解説します。ここでの辞書は、特定の文字集合に関する部分的な辞書順序を表しています。つまり、辞書に含まれていない文字(空白や記号など)は順序の判定対象外となり、単純に読み飛ばされます。入力例と期待される出力たとえば、dictionary = bdc、s = bbbb h ddd i cccc という入力が与えられた場合、出力は True になります。これは、辞書内に存在する文字だけに着目すると、すべての「b」が「d」より先に現
-
【Python】リスト内に「数値とその3倍」のペアが存在するか判定するアルゴリズム
問題の概要数値のリスト nums が与えられたとき、その中に「一方の数がもう一方の数のちょうど3倍」となっているペアが存在するかどうかを判定します。たとえば、入力が nums = [2, 3, 10, 7, 9] の場合を考えてみましょう。このリストには 3 と、その3倍である 9 が含まれているため、出力は True になります。解き方の考え方この問題は、リストをあらかじめソートしておき、2つのポインタを使って走査することで効率的に解けます。ある数の3倍は必ず元の数よりも大きいため、昇順に並べたリストに対して前方向きにポインタを動かせばよいのがポイントです。ポインタ i を 0 に初期化する
-
Pythonで片方向連結リストが厳密に昇順かどうかを判定する方法
はじめにこの記事では、Pythonを使って片方向連結リスト(Singly Linked List)の各ノードの値が厳密に昇順(strictly ascending order)に並んでいるかどうかを判定するアルゴリズムを解説します。「厳密に昇順」とは、隣り合うノードの値が等しくならず、必ず前の値より大きくなっている状態を指します。つまり、a < b < c ... のような並びが必要です。問題の概要連結リストの先頭ノード(head)が与えられたとき、すべてのノードの値が厳密な昇順にソートされているかどうかを確認します。例えば、入力が [2, 61, 105, 157] の場合、各要
-
Pythonで学ぶAtbash暗号:アルファベットを反転させる暗号化アルゴリズムの実装
Atbash暗号とはAtbash暗号は、古代ヘブライ語で使われていた歴史ある単一文字置換暗号の一種です。仕組みは非常にシンプルで、各文字をアルファベットの逆順に対応する文字へ置き換えます。つまり「a」は「z」に、「b」は「y」に、「c」は「x」というように、アルファベットを鏡写しにした対応関係が成り立ちます。問題の概要小文字のアルファベットのみで構成された文字列 text が与えられます。text の各文字を、アルファベット上で反対側に位置する文字へマッピングした新しい文字列を作成してください。たとえば、入力が abcdefg の場合、出力は zyxwvut となります。解法のアプローチこの問
-
Pythonで文字列がすべて一意の文字で構成されているか判定する方法
文字列 s が与えられたとき、その文字列がすべて一意(重複しない)な文字で構成されているかどうかを判定する問題について解説します。たとえば、入力が world の場合、すべての文字が異なるため出力は True になります。一方、hello のように同じ文字(l)が含まれる場合は False となります。解決のアプローチこの問題は、Python の set() を使うことで非常にシンプルに解決できます。手順は以下のとおりです。set_var := 文字列 s のすべての文字から新しいセット(集合)を作成するset_var のサイズが s の長さと一致すれば True を返し、そうでなければ Fa