[Programmers][Python]機能の開発
16441 ワード
質問する
に答える
Trual 1 stプール
import math
def solution(progresses, speeds):
left = []
result = []
for i, v in enumerate(progresses):
left.append(math.ceil((100-v)/speeds[i]))
key = left[0]
count = 1
for i in range(1, len(left)):
if key >= left[i]:
count += 1
else:
left.append(count)
key = left[i]
count = 1
result.append(count)
return result
回答は次のとおりです.
Trual 1 stプール
import math
def solution(progresses, speeds):
left = []
result = []
for i, v in enumerate(progresses):
left.append(math.ceil((100-v)/speeds[i]))
key = left[0]
count = 1
for i in range(1, len(left)):
if key >= left[i]:
count += 1
else:
left.append(count)
key = left[i]
count = 1
result.append(count)
return result
回答は次のとおりです.解けましたが、いくつか残念な点がありました.
第一に、私は100以上の数字を加える方法が好きではありません.mathライブラリをmathと呼ぶ私はceil関数を書きましたが、これ以上良い方法はありませんか?
(progress + iterator*speeds) ≥ 100
前述したように、100以上であることを確認すれば、アップロード機能を使わなくてもよい.
2つ目は残念なことに、この問題タイプはスタック/キューであり、私が書いたコードはスタックの特徴をよく体現していない.最初のインデックス要素をpop()に編成すれば、キューのように実現できます.(例えば
pop(0)
)Trual 2 ndプール
def solution(progresses, speeds):
print(progresses)
print(speeds)
answer = []
time = 0
count = 0
while len(progresses)> 0:
if (progresses[0] + time*speeds[0]) >= 100:
progresses.pop(0)
speeds.pop(0)
count += 1
else:
if count > 0:
answer.append(count)
count = 0
time += 1
answer.append(count)
return answer
コードはもっときれいになったようですが、時間が増えました.
これは,1番目のコードでo(1)がタスクを完了するのに要する時間を求め,2番目のコードではwhileゲートを回すことで探すためである可能性がある.
問題の意図に合っているかどうかはわかりませんが...mathライブラリが使えるなら、最初のコードのように書くのもいいようです.
Trial 3 rdプール
教授はzip()関数の使用を推奨する.
zip関数
同じ長さのiterable資料型(リスト、図例)の各要素をインデックス順に組み合わせて、新しいiterable資料型を生成します.
a = [1, 2, 3]
b = ['mon', 'tue', 'wed']
c = ['red', 'green', 'blue']
new_zip = zip(a, b, c)
前述したように、印刷後印刷(type(new zip)、出力はclass<'zip'>
である.<class 'zip'>
print(list(new zip))を使用してlistタイプに変換できます.[(1, 'mon', 'red'), (2, 'tue', 'green'), (3, 'wed', 'blue')]
for x, y in zip(range(10), range(10)):
print(x, y)
iterableデータ型を作成しないで、for文を使用して新しいzipクラスを作成することもできます.dict_num = { x:y for x, y in zip(range(10),range(10))}
zip()関数と理解を使用してディックシリーズを生成できます.{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
zip()関数のほかに,Pythonの除算演算方式が新たに認識された.cでは、除算演算を行う際に、小数点の後部を完全に捨て、除算の整数部分を得る.
一方、Pythonは
내림
を使用してシェアを表している.例とともに表示:
C(捨てる)Python(下ろす)7/3=2.333…=27/3 = 2.333 ... = 27/-3 = -2.333 ... = -27/3 = -2.333 = -3
シェアが下がるにつれて、残りの値も変わります.
C(廃棄)Python(廃棄)7=3*2+17=3*2+17=(-3)*(-2)+17=(-3)*(-3)+(-2)
C言語ではX%Y(7%3)の演算結果はXの符号と同じである.また、3を姉-3で割ると姉の結果になります.逆にPythonではX%Y(7%-3)演算結果の符号はYの符号と同一である.
math.ceil
を使用しないで、小数点を上に移動するにはどうすればいいですか?考えたことがあります.pythonのドロップダウン演算特性を用いて簡単に解決できる.
100-xではなく、x-100で負数を求め、分けて-を加えて正数にします.
-((p-100)//s
また,リスト内の負数インデックスは後ろから逆数になる.a = list(range(10))
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[-1], a[-2]) # 9 8
-1インデックスを使用するのは、リストの最後のエントリを追跡するための要素です.本問題では,所要時間が増加するとzipの最初のコラムで更新されるためresult[1][0]と−(p−100)/s)を比較し,結果に要する時間よりも長い場合を見出すことができる.
最終コード!
def solution(progresses, speeds):
result=[]
for p, s in zip(progresses, speeds):
if len(result)==0 or result[-1][0]<-((p-100)//s):
result.append([-((p-100)//s),1])
else:
result[-1][1]+=1
return [i[1] for i in result]
前の2つのコードに比べて、テストケース7から確認できる時間が減りました!
Reference
この問題について([Programmers][Python]機能の開発), 我々は、より多くの情報をここで見つけました https://velog.io/@bae12/ProgrammersLevel2Python기능개발テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol