-
Pythonで2値行列内の「特別な位置」の数を求めるプログラム
問題の概要m × n の2値(0と1のみで構成された)行列が与えられたとき、その中に含まれる「特別な位置」の総数を求めることを考えます。ここで、位置 (i, j) が「特別」とみなされるのは、mat[i][j] = 1 であり、かつ i 行目と j 列目にあるその他のすべての要素が 0 である場合です。つまり、その行と列の中で唯一の 1 になっているマスを探す問題です。たとえば、次のような入力が与えられたとします。10000001000001101000この場合の出力は 3 になります。特別な位置は (0, 0)、(1, 2)、(3, 1) の3箇所です。解き方のアルゴリズムこの問題は、次の手
-
Pythonで配列内のすべての奇数長部分配列の合計を求める方法を解説
正の整数からなる配列 nums が与えられたとき、考えられるすべての奇数長の部分配列(サブ配列)の要素の合計を求めます。なお、部分配列とは元の配列から連続して取り出された部分列のことを指します。 具体例で確認する 例として、nums = [3, 8, 2, 5, 7] が入力された場合を考えてみましょう。このときの出力は 92 になります。対象となる奇数長の部分配列は以下の通りです。 nums[0] = 3 nums[1] = 8 nums[2] = 2 nums[3] = 5 nums[4] = 7 nums[0..2] → 合計 = 13 nums[1..3] → 合計 = 15 nu
-
Pythonで文字列内の単語間スペースを均等に再配置するプログラム
問題の概要 文字列 s が与えられ、その中にはいくつかの単語が複数のスペースを挟んで配置されています。各単語は少なくとも1つのスペースで区切られているものとします。ここで、隣り合う単語どうしの間に入るスペースの数がすべて同じになり、しかもその間隔が最大になるように、スペースを再配置することを考えます。すべてのスペースを均等に振り分けられない場合は、余ったスペースは文字列の末尾にまとめて置くこととします。 たとえば、入力が s = I love programming の場合、出力は I love programming となります。元の文字列に含
-
【Python】フォルダ移動ログからホームディレクトリへ戻るための最小操作回数を求めるプログラム
問題の概要 フォルダへの移動履歴(ログ)が与えられ、その中には次のような記号が含まれているものとします。 ../ : 現在のフォルダから親フォルダへ移動する(すでにメインフォルダにいる場合は位置を変えない)。 ./ : 現在のフォルダにとどまる。 x/ : x という名前の子フォルダへ移動する。 このログをもとに、最後に到達したフォルダからメインフォルダ(ホーム)へ戻るために必要な最小の操作回数を求めるのが目的です。 たとえば、入力が logs = [Dir1/,Dir2/,../,Dir2/,Dir3/,./] の場合、出力は 3 になります。 図を見るとわかるように、ホームに戻るまでに
-
Pythonで駐車システムを設計するプログラムの実装方法
駐車システムを設計することを考えてみましょう。この駐車場には「大型」「中型」「小型」の3種類の駐車スペースがあり、それぞれのサイズごとに決められた数のスロットが用意されています。ここでは、以下の2つのメソッドを持つ OurParkingSystem というクラスを作成します。constructor(big, medium, small) − 各サイズの利用可能なスロット数を受け取り、OurParkingSystem クラスのオブジェクトを初期化するコンストラクタです。addCar(carType) − 駐車しようとしている車について、指定された carType に対応する駐車スペースが空いてい
-
Pythonで「x以上の要素がちょうどx個」ある特別な配列のxを求めるプログラム
すべての要素が 0 または正の整数である配列 nums があるとします。この配列は、ある数値 x が存在して、nums の中に「x 以上の要素」がちょうど x 個含まれるとき、特別な配列(special array)と呼ばれます。ポイントは、x が必ずしも nums の要素である必要はないという点です。配列が特別な配列であればその x を求め、そうでなければ -1 を返します。たとえば、入力が nums = [4, 6, 7, 7, 1, 0] の場合を考えてみましょう。4 以上の要素は 4, 6, 7, 7 の 4 個あるため、出力は 4 となります。解き方のアプローチこの問題は、次の手順で
-
Pythonで最小・最大5%の要素を除外した配列の平均値を求める方法
データ分析では、外れ値(極端に大きい、または小さい値)が平均値に与える影響を避けるため、一定割合の要素を除外してから平均を計算することがよくあります。本記事では、数値のリスト nums が与えられたとき、最小の5%と最大の5%の要素を削除した残りの値の平均(トリム平均)を求めるPythonプログラムを紹介します。問題の例例えば、次のような入力を考えてみましょう。nums = [2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8]この場合、最小値の 2 と最大値の 8 が削除対象となり、残りの要素はすべて 4 なので、出力は 4.0 になります。解決の手順この問題は、
-
Pythonで2つの同一文字の間に挟まれた最長部分文字列を求めるプログラム
文字列 s が与えられたとき、同じ文字2つに挟まれた部分文字列のうち、両端の2文字を除いた部分の最大の長さを求める問題を考えます。該当する部分文字列が存在しない場合は、-1 を返します。例えば、s = level の場合、出力は 3 になります。これは、先頭と末尾の l の間に eve(長さ3)が挟まれているためです。解法のアプローチこの問題は、各文字の出現位置を記録し、同じ文字の最初の出現位置と最後の出現位置の差を調べることで効率的に解けます。手順は以下の通りです。memo := 新しいマップ(辞書)を作成するi を 0 から s のサイズ - 1 まで繰り返す:s[i] が memo に存
-
Pythonで要素の出現頻度が少ない順に配列をソートするプログラム
問題の概要 同じ要素が複数回出現する可能性のある配列が与えられたとします。この配列を、出現頻度が少ない順(頻度の昇順)に並べ替えることを考えます。つまり、出現回数が最も少ない要素から先に並べ、以降も頻度の昇順に従ってソートしていきます。 例えば、入力が nums = [1,5,3,1,3,1,2,5] の場合、出力は [2, 5, 5, 3, 3, 1, 1, 1] となります。 この例では、「2」は1回、「5」と「3」はそれぞれ2回、「1」は3回出現します。そのため、頻度の少ない順に「2 → 5 → 3 → 1」の順で並びます。なお、同じ頻度の要素同士(5と3)は、値の大きい方から先に並ぶ点
-
Pythonで配列の断片から元の配列を再構築できるか判定する方法
問題の概要すべての要素が一意(ユニーク)である整数配列 nums と、複数の小さな配列を要素として持つ配列 pieces が与えられているとします。このとき、pieces 内の配列を任意の順序で連結することによって、元の配列 nums を再現できるかどうかを判定するのが本記事のテーマです。重要な制約として、各断片(pieces[i])内部の要素の順序を入れ替えることは許されません。断片はそのままの形で使う必要があります。具体例たとえば、次のような入力を考えてみましょう。nums = [5,1,12,36,2,47,6]pieces = [[2,47,6],[12,36],[1],[5]]この場
-
Pythonで特定のルールに従って生成した配列の最大値を求めるプログラム
この記事では、特別なルールに従って生成された配列の中から最大値を求めるPythonプログラムを解説します。問題の概要ある整数 n が与えられたとします。このとき、次のルールに従って長さ n + 1 の配列 A を生成することを考えます。A[0] = 0A[1] = 1A[2 * i] = A[i](2 ≤ 2 * i ≤ n の場合)A[2 * i + 1] = A[i] + A[i + 1](2 ≤ 2 * i + 1 ≤ n の場合)つまり、偶数番目の要素は半分のインデックスの値をそのままコピーし、奇数番目の要素は隣り合う2つの要素の和になるという再帰的な定義です。最終的なゴールは、生成さ
-
Pythonで暗号コードを解読するプログラム|循環配列の復号アルゴリズムを解説
問題の概要 爆弾を解除しなければならない場面を想像してください。残り時間はわずか!あなたの手元には、長さ n の循環配列 code と整数の鍵 k が渡されています。コードを解読するには、すべての数値を次のルールに従って同時に置き換えなければなりません。 k > 0 の場合:i 番目の数値を「次の k 個の数値の合計」で置き換えます。 k < 0 の場合:i 番目の数値を「前の k 個の数値の合計」で置き換えます。 k = 0 の場合:i 番目の数値を 0 で置き換えます。 配列は循環しているため、code[n-1] の次の要素は code[0]、code[0] の前の要素は
-
Pythonで2つの文字列配列が同一の文字列を表すかどうかを判定する方法
word1とword2という2つの文字列型の配列があるとします。このとき、両方の配列が同じ文字列を表しているかどうかを判定する必要があります。ここで「配列が文字列を表している」とは、配列内の要素を順番どおりに連結した結果が、その文字列と一致することを意味します。問題の例たとえば、入力が word1 = [ko, lka, ta]、word2 = [k, olk, at, a] の場合を見てみましょう。どちらの配列も連結すると kolkata になるため、出力は True となります。解決のための手順この問題を解くには、以下の手順に従います。空文字列 s1 と s2 を用意します。word1 内
-
Pythonで文字列内の最大k回繰り返し部分文字列(k-repeating)を見つける方法
問題の概要 文字列 s が与えられたとき、文字列 w を k 回連結した結果が s の部分文字列になる場合、w は「k-repeating(繰り返し)文字列」であると言います。そして、w の最大 k-repeating 値とは、その条件を満たす最大の k のことです。もし w が s の部分文字列として一度も現れない場合は、最大 k-repeating 値は 0 になります。 例えば、s = papaya、w = pa の場合、pa は papaya の中に2回現れるため、答えは 2 となります。 解決のための手順 s の中に w が出現する回数を数えます 出現回数が 0 の場合は、0 を
-
Pythonで最も裕福な顧客の総資産額を求めるプログラム
本記事では、m × n の行列 accounts が与えられたとき、accounts[i][j] が「i 番目の顧客が j 番目の銀行に保有している金額」を表すものとして、最も裕福な顧客の総資産額を求める方法を解説します。ここで「最も裕福な顧客」とは、すべての銀行における保有金額の合計が最大となる顧客のことです。問題の例例えば、入力が以下のような行列だったとします。102015305201051215123この場合、出力は 55 になります。2番目の顧客(2行目)の資産は 30 + 5 + 20 = 55 となり、全顧客の中で最大だからです。解法のアプローチこの問題は、次の手順で解くことができ
-
Pythonですべての学生グループを収容できるバスのサイズを求めるプログラム
問題の概要 n個の学生グループが、大学バスで自宅に帰るため待機しています。各グループにはm人の学生がいます。学生たちは仲間と離ればなれになることを嫌うため、グループの全員が乗車できる場合にのみバスに乗ります。さらに、グループは必ず順番を守って乗車し、前のグループが乗り終わる(または目的地に到着する)までは自分の順番が回ってきません。 そこで、グループの数と各グループの人数が与えられたとき、「すべてのグループを輸送でき、かつ大学を出発するたびにバス内に空席がひとつもない」ようなバスのサイズをすべて求めます。 入力例と出力例 たとえば、各グループの人数が gr_no = [3, 4, 2, 2,
-
Pythonプログラム:(基数、数値)ペアの配列内で一致する組み合わせの数を見つける方法
(x, y) 形式の複数のペアが与えられます。ここで、x は数値の基数(base)を、y はその数値そのものを表します。リストの中には、異なる表記でありながら同じ値を意味するペアが存在する場合があります。そこで、与えられた数値ペアの中に一致する組み合わせがいくつあるかを調べる必要があります。なお、入力には重複したペアや、無効な基数と数値の組み合わせが含まれる可能性もあります。 例として、num_inputs = 2、input_arr = [(10, 15), (8, 17)] の場合の出力は 1 になります。 変数 num_inputs は入力の個数を示し、配列 input_arr は数値ペ
-
Pythonで数日後の製品価格を計算するプログラム(剰余演算対応)
ある人が価格 x の製品を購入したいと考えているとしましょう。しかし、この製品は日が経つごとに価格が前日の x 倍に上昇していきます。そこで、購入を決意してから y 日後に製品の価格がいくらになっているかを求める必要があります。価格が非常に大きな値になる場合は、答えを 109 + 7 で割った余り(モジュロ)として出力します。入力はペア(タプル)のリストとして与えられ、各ペアの最初の値が初期価格 x、2番目の値が経過日数 y です。たとえば、入力が以下の場合を考えてみます。nums = [(5, 2), (6, 8), (2, 12), (272276424281295379223889458
-
コンテナに金属棒を詰めるのに必要な操作回数を求めるPythonプログラム
異なる長さを持つ複数の金属棒を輸送するタスクが与えられたとしましょう。ところが、輸送用コンテナの長さは短く、長さ1の棒しか収容できません。n 本の棒が与えられ、それぞれの長さはリスト形式で渡されます。すべての棒をコンテナに収めるには、各棒を切断して単位長さ(長さ1)に分割する必要があります。そのうえで、分割したすべての棒をコンテナへ詰め込む作業が1操作としてカウントされます。ここで求めたいのは、棒に対して実行しなければならない操作の合計回数です。 この問題の鍵となるのは素因数分解の活用です。あらかじめエラトステネスの篩(ふるい)で十分な範囲の素数を生成しておくことで、大きな値でも効率的に操作
-
Pythonで解く!円管内のボールが衝突する回数を求めるアルゴリズム
問題の概要 円状の管(円管)の中に n 個のボールが入っているとします。管の長さは100メートルで、最初は各ボールが「スタート地点」と呼ばれる基準点から i メートル離れた位置に配置されています。ここからボールたちは、それぞれ異なる方向へ向かって管の中を周回し始めます。ボールの移動速度は毎秒0.1メートルです。 2つのボールが同じ地点で出会うと衝突が発生し、衝突したボールは互いに進行方向を反転させます。この過程を 109+6 秒という非常に長い時間にわたって続けたとき、ボール同士が衝突する合計回数を求めるのがこの問題です。各ボールのスタート地点からの初期距離が入力として与えられます。 たとえ