Pythonでn回の操作(挿入・コピー・ペースト)で入力できる最大文字数を求めるプログラム
問題概要
ある整数 n が与えられたとき、以下の3種類の操作をちょうど n 回行って画面に入力できる最大の文字数を求める問題です。
- 文字「x」を1つ挿入する
- 現在表示されているすべての文字をコピーする
- コピーした内容を貼り付ける(ペーストする)
例えば、入力が n = 12 の場合、出力は 81 になります。
解法のアプローチ
この問題は、貪欲法(グリーディ法)を使うことで効率的に解けます。ポイントは、操作の組み合わせによって文字数の増加パターンが周期的に現れることです。
n が小さい場合(n ≤ 4)は、毎回「x」を挿入するだけが最適なので、答えはそのまま n になります。一方、n が大きい場合は「挿入 → コピー → ペースト」を組み合わせて文字数を効果的に増やしていきます。
具体的な手順は以下のとおりです。
- n ≤ 4 の場合は n をそのまま返す
- v = 6(現在の文字数)、x = 3(1回あたりの増加量)、i = 5(現在の操作回数)、j = 0(周期カウンタ)で初期化する
- i が n に等しくなるまで、以下を繰り返す
- v に x を加算する
- i と j をそれぞれ 1 ずつ増やす
- j が 3 で割り切れるとき:x を 1.5 倍にする
- j を 3 で割った余りが 1 のとき:何もしない
- それ以外(余りが 2)のとき:x を 2 倍にする
- 最終的な v を結果として返す
実装例
class Solution:
def solve(self, n):
if n <= 4:
return n
v = 6
x = 3
i = 5
j = 0
while i != n:
v += x
i += 1
j += 1
if j % 3 == 0:
x = int(x * 1.5)
elif j % 3 == 1:
pass
else:
x *= 2
return v
ob = Solution()
n = 12
print(ob.solve(n))
入力
12
出力
81
計算量と補足
このアルゴリズムの時間計算量は O(n)、空間計算量は O(1) です。動的計画法(DP)を使って「dp[i] = max(dp[i-1] + 1, dp[i-b] × (b-1))」のように解く方法もありますが、本手法では増加率(×1.5、据え置き、×2)を3操作周期で適用するだけでよく、追加メモリなしで最大文字数を求められる点が特徴です。
-
Pythonで括弧の各深さごとの文字数をカウントするプログラムの作成方法
文字列 s が与えられます。この文字列は「X」「(」「)」の3種類の文字のみで構成されており、括弧は必ずバランスが取れていて、その間に「X」が含まれています。また、括弧は再帰的にネストしている場合もあります。 この課題では、最も浅い深さから最も深い深さへ向かって、各括弧の深さごとに「X」の個数を求めます。 入力例と出力例 たとえば、入力が s = (XXX(X(XX))XX) の場合、出力は [5, 1, 2] になります。 深さ0(最も外側の括弧の中)には「X」が5個 深さ1には「X」が1個 深さ2(最も内側の括弧の中)には「X」が2個 解き方のアプローチ この問題は、次の手順で解くこと
-
Pythonで8パズルの最短手数を求めるプログラムを実装する方法
8パズルは、3×3の盤面に0から8までの重複しない数字が配置された古典的なスライディングパズルです。0(空白)は上下左右の隣接マスと入れ替えることができ、すべての数字を昇順に並べ替えた状態(0, 1, 2, ..., 8)を目標とします。本記事では、初期盤面からゴール状態へ到達するまでの最小手数を求めるPythonプログラムを紹介します。 問題の例 例として、次のような盤面が入力された場合を考えます。 312 475 680 この場合の出力は 4 になります。つまり、4回の入れ替え操作でゴール状態に到達できることを意味します。 解法の考え方:幅優先探索(BFS) この問題は幅優