-
Pythonで解く「DI文字列マッチ」問題 ― 条件を満たす順列の求め方
問題の概要 「I」(増加:Increase)と「D」(減少:Decrease)のみで構成された文字列 S が与えられます。S の長さを N とするとき、[0, 1, ..., N] の順列 A のうち、すべての i(0 ≤ i ≤ N−1)について次の条件を満たすものを任意に 1 つ返してください。 S[i] が「I」の場合:A[i] < A[i+1] S[i] が「D」の場合:A[i] > A[i+1] たとえば、入力が IDID の場合、出力は [0, 4, 1, 3, 2] となります。 解法のアプローチ この問題は貪欲法(グリーディ法)を使うことでシンプルに解けます。手
-
Pythonで各列をソート済みにするために削除すべき列の最小数を求める方法
N個の小文字のみで構成された文字列の配列Aがあるとします。すべての文字列は同じ長さです。ここで、任意の削除インデックスの集合を選び、各文字列からそのインデックス位置にある文字をすべて削除できるものとします。 例えば、配列Aが[abcdef, uvwxyz]で、削除インデックスが{0, 2, 3}の場合、削除後の最終的な配列は[bef, vyz]となり、Aの残りの列は[b,v]、[e,y]、[f,z]となります。 削除インデックスの集合Dを選んだとき、削除後にAの残りの各列が非降順(昇順)にソートされている状態にしたいとします。このとき、Dの長さとしてあり得る最小値を求めるのが問題です。 入力が
-
Pythonで解く「強力な整数」問題:x^i + y^j の全組み合わせを効率的に列挙する
「強力な整数」とは何か 正の整数 x と y が与えられたとき、ある整数 n が n = xi + yj(i ≥ 0、j ≥ 0)の形で表せるとき、n を強力な整数(Powerful Integer)と呼びます。この記事では、bound 以下の値をもつ強力な整数をすべて列挙するアルゴリズムを、Python の実装例とともに分かりやすく解説します。 たとえば x = 2、y = 3、bound = 10 という入力に対しては、出力は [2, 3, 4, 5, 7, 9, 10] になります。それぞれの値は次のように構成されています。 2 = 20 + 30 3 = 21 + 30 4 = 20
-
Pythonで三角形の最大周囲長を求めるアルゴリズムと実装方法
問題の概要正の整数の長さが格納された配列Aが与えられたとき、その中から3つの長さを選んで作れる「面積が0より大きい三角形」のうち、周囲の長さ(perimeter)が最大になるものを求めます。もし面積が0より大きい三角形を一つも作れない場合は、0を返します。例えば、入力が [3,6,2,3] の場合、出力は 8 となります。これは、長さ3、3、6の3辺を選ぶと、3 + 3 + 6 = 12ではなく、実際には条件を満たす組み合わせの中で最大の周囲長が8になるためです。解法のアプローチこの問題は、次の手順で効率的に解くことができます。配列Aを昇順にソートする末尾(最も大きい値)から要素を3つ取り出し
-
Pythonで5で割り切れる2進数プレフィックスを判定するアルゴリズム
問題の概要0と1のみで構成された配列Aが与えられます。ここでN[i]とは、「A[0]からA[i]までの部分配列を2進数として解釈した数値」のことです。本記事のゴールは、N[i]が5で割り切れるとき、かつそのときに限りanswer[i]がtrueとなるブール値(真偽値)のリストを求めることです。例えば、入力が[0,1,1,1,1,1]の場合、出力は[true, false, false, false, true, false]となります。解法のアプローチこの問題は、以下の手順で解くことができます。length:配列Aのサイズを取得します。ans:長さlengthの配列を作成し、すべてfalseで
-
Pythonで複数のパスから最長の共通ディレクトリパスを求める方法
このチュートリアルでは、与えられたパスのリストの中から最長の共通ディレクトリパスを見つけるプログラムを作成します。まずは具体例を使って、問題の内容を確認してみましょう。 入力例 paths = [home/tutorialspoint/python, home/tutorialspoint/c, home/tutorialspoint/javascript, home/tutorialspoint/react, home/tutorialspoint/django] 期待される出力 home/tutorialspoint 上記の5つのパスはすべて「home/tutorialspoint」
-
Pythonで2つの三角形の相似を判定するプログラム(SSS・SAS・AAA)
本記事では、Pythonを使って2つの三角形が相似しているかどうかを判定するプログラムを紹介します。判定には、幾何学でよく知られる相似条件「SSS」「SAS」「AAA」の3つを使用し、これらの条件をもとに三角形の相似関係を証明します。 三角形の相似条件とは 2つの三角形が相似であるかを調べる際に用いられる主な条件は以下のとおりです。 SSS(三辺比相等):対応する3組の辺の比がすべて等しい SAS(二辺比・挟角相等):2組の対応する辺の比が等しく、それらに挟まれた角も等しい AAA(三角相等):対応する3つの角がすべて等しい なお、「合同」は対応する辺の長さが完全に一致する場合を指すのに対
-
【Python入門】N番目までのサブリストから要素を取得する3つの方法
このチュートリアルでは、ネストされたリスト(サブリストのリスト)から、N番目までのサブリストの要素を取得するプログラムの作成方法を解説します。 例として、次のような5つのサブリストを持つリストを考えてみましょう。 [[Python, Java], [C, Pascal], [Javascript, PHP], [C#, C++], [React, Angular]] ここでの目標は、最初の3つのサブリストから、それぞれの先頭の要素を取り出すことです。実現方法はいくつかあるため、代表的なアプローチを順番に見ていきましょう。 方法1:forループを使う 多くのプログラマーが真っ先に思いつくのが
-
Pythonでリスト内のアナグラムをグループ化する方法を解説
このチュートリアルでは、リストに含まれるすべてのアナグラムをグループ化するプログラムを作成します。まずは、アナグラムとは何かを確認しておきましょう。 アナグラムとは、使用されている文字が同じで、並び順だけが異なる2つの文字列のことを指します。 解決策に入る前に、具体的な例を見てみましょう。 入力例 [cat, dog, fired, god, pat, tap, fried, tac] 出力例 [[cat, tac], [dog, god], [fried, fired], [pat, tap]] この問題は、大きく2つのステップに分けて考えることができます。まず、2つの文字列がアナグラムか
-
Pythonで複数のリストの同じインデックスにある要素をグループ化する方法
このチュートリアルでは、複数のリストに含まれる同じインデックスの要素を1つのリストにまとめるプログラムを作成します。なお、ここでは「すべてのリストが同じ長さである」という条件を設けています。まずは例を見て、処理内容を具体的に理解しましょう。 入力 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 出力 [[1, 4, 7], [2, 5, 8], [3, 6, 9]] この問題はいくつかの方法で解くことができます。まずは、通常のループを使った基本的な解き方から見ていきましょう。 リストのリストを初期化します。 結果を格納するための空のリストを用意します。 サブリストの長さ分
-
【Python】最初の要素が同じタプルをリスト内でグループ化する方法
このチュートリアルでは、最初の要素が同じタプルをすべてグループ化するPythonプログラムを作成します。まず、具体的な入出力の例を見ながら、どのような処理を行うのかを確認しましょう。 入力例 [(1, 2, 3), (1, 4, 5), (3, 4, 1), (3, 4, 2)] 出力例 [(1, 2, 3, 4, 5), (3, 4, 1, 4, 2)] ご覧のとおり、最初の要素が「1」である2つのタプルは1つにまとめられ、「3」で始まる2つのタプルも同様に統合されています。それでは、この問題を解くための手順を確認していきましょう。 解決の手順 タプルのリストを初期化します。 結果
-
Pythonでタプルのリストをキーごとにグループ化して合計する方法
このチュートリアルでは、複数のリストに存在する同じキーを持つ値をすべて合計するPythonプログラムを作成します。まず、具体的な例を見て、やりたいことを確認しましょう。 入力データ list_one = [(a, 2), (b, 3), (c, 5)] list_two = [(c, 7), (a, 4), (b, 2)] 期待される出力 [(a, 6), (b, 5), (c, 12)] 各キー(a、b、c)について、両方のリストの値が足し合わされています。例えば a は 2 + 4 = 6、c は 5 + 7 = 12 となります。 解決手順 この問題は、次の手順で解決できます。 リスト
-
【Python入門】itertools.groupbyでリスト内の類似文字列をグループ化する方法
このチュートリアルでは、リスト内の類似した文字列をグループ化するプログラムをPythonで作成します。まずは具体的な例を見ながら、処理の流れを確認していきましょう。入力データstrings = [tutorials-python, tutorials-c, tutorials-java, tutorials-javascript, python-1, python-2, javascript-1]期待される出力[[tutorials-python, tutorials-c, tutorials-java, tutorials-javascript], [python-1, python-2],
-
Pythonのholidaysライブラリで世界各国の祝日を簡単に取得・判定する方法
このチュートリアルでは、Pythonのholidaysライブラリについて解説します。holidaysライブラリを使うと、さまざまな国の特定の日が祝日かどうかを簡単に判定できます。取得できるのは公的な祝日(public holidays)のみですが、世界中の国に対応しているのが魅力です。holidaysライブラリのインストールまず、以下のコマンドでモジュールをインストールしましょう。pip install holidaysインストールが完了したら、実際に祝日情報を取得してみます。ここでは例として、2020年のインドの祝日一覧を取得する手順を紹介します。対応している国のコードは、holidaysラ
-
Pythonで関数名を取得する方法!Python2とPython3の違いをわかりやすく解説
このチュートリアルでは、Pythonで関数名を取得する方法について学びます。関数の名前を取得するのは非常にシンプルな操作ですが、Python2とPython3では使用するプロパティが異なる点に注意が必要です。それぞれの方法を順番に見ていきましょう。 Python2で関数名を取得する方法 Python2では、すべての関数がfunc_nameというプロパティを持っており、これを使うことで現在の関数名を簡単に取得できます。実際のコード例を見てみましょう。以下のサンプルを実行する際は、必ずPython2環境を使用してください。 コード例(Python2) # 関数を定義 def testing_fun
-
Pythonでリストの最後の要素を取得する3つの方法
このチュートリアルでは、Pythonのリストから最後の要素を取得するさまざまな方法を解説します。代表的な3つの手法を、コード例と実行結果とともに順番に見ていきましょう。1. インデックスを使う方法リストの長さを利用して、最後の要素のインデックス(リストの長さ - 1)を計算することで、最後の要素にアクセスできます。以下のコードを見てみましょう。コード例# リストの初期化 numbers = [1, 2, 3, 4, 5] # 最後の要素を出力 print(fLast element:- {numbers[len(numbers) - 1]})実行結果上記のプログラムを実行すると、次の出力が得ら
-
Pythonで文字列のリストをソートする方法【sort()とsorted()の使い方】
このチュートリアルでは、Pythonで文字列のリストをソートする方法を解説します。リストのsort()メソッドと組み込み関数sorted()を使った基本的な並べ替えに加え、文字数や数値など、さまざまな条件に基づいたソートの方法まで詳しく見ていきましょう。 sort()メソッドで昇順にソートする まずは、list.sort()メソッドを使った基本的なソート方法です。sort()メソッドは元のリストを直接書き換える(インプレースでソートする)点が特徴です。それではコードを見てみましょう。 サンプルコード # 文字列のリスト strings = [Python, C, Java, Javascrip
-
Pythonでリストの各要素の後に増加するパターンを挿入する方法
このチュートリアルでは、リストの各要素の後ろに、要素の位置に応じて数が増えていくパターン(記号)を挿入するプログラムをPythonで作成します。まずは具体例を見て、動作イメージをつかみましょう。入力例alphabets = [a, b, c]出力例[a, #, b, ##, c, ###]上記のように、1つ目の要素の後には「#」が1個、2つ目の要素の後には「##」が2個というように、挿入される記号の数が順番に増えていきます。解決手順以下の手順に従って問題を解いていきます。元となるリストを初期化する。結果を格納するための空のリストを作成する。元のリストを反復処理する。現在の要素と、その位置に対応
-
指定したインデックスからPythonのリストを循環的に反復処理する方法
はじめに このチュートリアルでは、指定したインデックスからスタートして、リストを循環的に反復処理するプログラムを作成します。リストの末尾に達したら先頭に折り返す、いわゆる「循環イテレーション」は、実際の開発でもよく使われるテクニックです。 解決手順 リストと開始インデックスを初期化する。 len() 関数でリストの長さを取得する。 取得した長さをもとにリストを反復処理する。 index % length(剰余演算)で現在の要素のインデックスを求める。 要素を出力する。 次の要素に備えてインデックスを1つ増やす。 基本的には単純なループ処理なので、特別に難しいところはありません。それでは、実
-
Pythonでネストされたリスト(サブリスト)の要素のインデックスを取得する方法
はじめにこのチュートリアルでは、ネストされたリスト(リストの中にリストが入った構造)から、特定の要素が含まれるサブリストのインデックスを見つけるプログラムを作成します。まずは具体例を見て、動作をしっかり理解しましょう。入力nested_list = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]出力7 のインデックス: 2 5 のインデックス: 1 3 のインデックス: 0解決の手順この問題は、シンプルかつ最も一般的な方法で解くことができます。以下の手順に従って進めてください。ネストされたリストを初期化する。インデックスを使って外側のリストを反復処理する。各サブリストを反復