Pythonで目標金額に達するまでの年数を計算するプログラムの作り方
問題の概要
パラメータとして、元本P、交互に適用される2つの利率OとE、そして目標金額Tが与えられます。Pドルを株式市場に投資し、市場は毎年交互にE%とO%の利回りを返すものとします。このとき、資産額が少なくともTドルに達するまでに何年かかるかを求めるのが課題です。
たとえば、入力が P = 200、O = 10、E = 25、T = 300 の場合、出力は 3 になります。1年目に25%の利息が付いて 200 + 50 = 250 ドルとなり、2年目に10%が付いて 250 + 25 = 275 ドル、3年目に再び25%が付いて 275 × 1.25 = 343.75 ドルになります。これは300ドルを超えているため、必要な年数は3年です。
解決のための手順
この問題は、次の手順に従って解くことができます。
- 経過年数を記録する変数 ans を 0 で初期化します。
- P が T 未満である間、次の処理を繰り返します。
- P に (1 + E/100) を掛けて、ans を 1 増やします。
- その後もなお P が T 未満であれば、P に (1 + O/100) を掛けて、ans をさらに 1 増やします。
- ループを抜けたら、ans を結果として返します。
実装例
以下の実装を見ると、処理の流れがより理解しやすくなります。
class Solution: def solve(self, P, O, E, T): ans = 0 while P < T: P *= 1+(E/100) ans += 1 if P < T: P *= 1+(O/100) ans += 1 return ans ob = Solution() P = 200 O = 10 E = 25 T = 300 print(ob.solve(P, O, E, T))
入力
P = 200, O = 10, E = 25, T = 300
出力
3
コードのポイント
whileループの中では、必ず最初にE%の利率を適用して1年分をカウントし、その時点でもまだ目標に届いていない場合にのみ、続けてO%の利率を適用してさらに1年分をカウントします。この「E→O」のサイクルを繰り返すことで、実際の複利運用と同じように元本が増加していきます。利率が正である限り元本は単調に増え続けるため、必ず目標金額Tに到達し、無限ループになる心配はありません。
-
【Python】森のすべての木が燃え尽きるまでの日数を求めるアルゴリズム
問題の概要 2次元の行列で森を表すことを考えます。各マスは次の3種類のいずれかです。 0:空き地(何もないマス) 1:木のあるマス 2:燃えている木のマス 毎日、上下左右に隣接するマス(斜め方向は含まない)の木が燃えていると、その木にも火が燃え移ります。このときすべての木が燃え尽きるまでにかかる日数を求めてください。もし全部の木を燃やすことが不可能な場合は -1 を返します。 入力例 たとえば、次のような森が与えられたとします。 121101111 この場合の出力は 4 になります。上段中央の燃えている木から火が1日ごとに周囲へ広がり、4日目についに最後の木が燃え尽きるためです。
-
Pythonで捕まえられる雨水の総量を計算するプログラム(トレッピング・レイン・ウォーター問題)
非負整数からなる長さ n の配列が与えられているとします。各要素はバーの高さを表し、それぞれのバーの幅は1です。このとき、雨が降った後に溜め込むことのできる水の総量を計算するのが本記事のテーマです。状況を図にすると、以下のようになります。図を見ると、水が溜まっている部分(青い箱)は全部で8個あります。したがって、このケースの出力は8となります。解法のアプローチこの問題は「スタック」を利用することで効率よく解けます。全体の手順は以下の通りです。スタック st、変数 water := 0、インデックス i := 0 を用意するi が高さ配列のサイズ未満である間、次の処理を繰り返すスタックが空である