Pythonで解く!エコモード搭載スマホのバッテリー残り時間を計算する方法
問題の概要
ここでは、「エコモード」を備えたスマートフォンを題材にしたプログラミング問題を考えてみましょう。このモードは、バッテリー残量が20%まで下がると自動的に有効になり、エコモード中は通常モードの2倍ゆっくりとバッテリーが消耗します。
家を出発した時点では、バッテリー残量はちょうど100%でした。そして、t分後には残りp%になっていたとします。このとき、スマートフォンの電源が完全に切れるまで、あと何分使用できるかを求めるのがこの問題です。
たとえば、入力が t = 75、p = 25 だった場合、出力は 45 となります。
解法のアプローチ
ポイントは、観測された残量 p が 20% 以上か未満かで状況が変わる点です。それぞれのケースに分けて考えます。
ケース1:p が 20% 以上の場合
この場合、観測期間中は一度もエコモードに切り替わっておらず、ずっと通常モードで動作していました。通常モードでの消耗率は、1分あたり (100 − p) / t % です。
残りのバッテリー p% を使い切るまでの時間は、まず20%まで通常モードで消耗し、そこから先はエコモード(消耗率が半分)で残り20%を消費すると考えると、次の式で表せます。
(p + 20) × t / (100 − p)
ケース2:p が 20% 未満の場合
この場合は、途中でエコモードに切り替わっています。通常モードの消耗率を r とすると、通常モードで80%(100%→20%)を消費した時間 80/r と、エコモードで (20 − p)% を消費した時間 2(20 − p)/r の合計が t 分になるため、r = (120 − 2p) / t と逆算できます。
現在の残量 p% はエコモードの消耗率 r/2 で減っていくので、残り時間は次の式になります。
2 × p × t / (120 − 2 × p)
実装例
以上のロジックをPythonで実装すると、次のようになります。
class Solution:
def solve(self, t, p):
if p < 20:
return 2*p*t/(120-2*p)
return (p+20)*t/(100-p)
ob = Solution()
print(ob.solve(75, 25))
入力
75, 25
出力
45.0
まとめ
この問題のように、条件によって消耗レートが変わるケースでは、「これまでどのモードで動いていたか」を残量から見極めることが重要です。if文による条件分岐と、比例関係を使った単純な計算だけで答えを導けるため、アルゴリズム思考の良い練習問題と言えます。
-
【初心者向け】Pythonのissuperset()メソッドの使い方をわかりやすく解説
はじめにこの記事では、Pythonのissuperset()メソッドについて、基本的な仕組みから実際のコード例まで詳しく解説します。issuperset()は、セット(集合)に対して使用できるメソッドで、引数として渡されたセットのすべての要素が、呼び出し元のセットに含まれているかどうかを判定します。呼び出し元のセットBが、引数のセットAのすべての要素を含んでいる場合 → True を返すセットAの要素がすべてBに含まれていない場合 → False を返すつまり、「BがAの上位集合(スーパーセット)であるかどうか」を判定するためのメソッドです。基本構文B.issuperset(A)この式は、Bが
-
PythonでQuine(クワイン)プログラムを書いてみよう
「Quine(クワイン)」とは、入力を一切受け取らずに、自分自身のソースコードを出力する特殊なプログラムのことです。一見すると不思議な自己言及的な仕組みですが、実装にはいくつかの厳格なルールがあります。最も重要な条件は、プログラム内部からソースコードファイルを読み込んではいけないという点です。つまり、純粋にコード自身の論理だけで自分の内容を再現しなければなりません。 サンプルコード Pythonでは、わずか1行でQuineを実現できます。 a=a=%r;print (a%%a);print (a%a) 実行結果 a=a=%r;print (a%%a);print (a%a) ご覧のとお