[問題解決]プログラマー-多段歯ブラシ販売(ハッシュ)[3級]
20664 ワード
問題の説明は省略します。リンクをクリックしてください。
提问链接
I/O例
enrollreferralselleramountresult
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"]
["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"]
["young", "john", "tod", "emily", "mary"]
[12, 4, 2, 5, 10][360, 958, 108, 0, 450, 18, 180, 1080] ["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"]
["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"]
["sam", "emily", "jaimie", "edward"]
[2, 3, 5, 4][0, 110, 378, 180, 270, 450, 0, 0]私の答え
最初のテストケースは10-タイムアウトです.
これはindex()関数が読み出すインデックスがリストサイズと同じであるため,速度が遅いためである.
def solution(enroll, referral, seller, amount):
answer = []
dic = dict()
for i in enroll:
dic[i] = 0
for i in range(len(seller)):
temp = seller[i]
profit =amount[i]*100
dic[temp] += profit
while referral[enroll.index(temp)] != "-":
dic[temp] -= profit//10
dic[referral[enroll.index(temp)]] += profit//10
profit = profit//10
temp = referral[enroll.index(temp)]
if profit<1:
break
print(dic)
dic[temp] -= profit//10
return list(dic.values())
だから次のコードのように、ディック・シャナリーを利用して問題を解決しました.for i in range(len(enroll)):
dic[enroll[i]] =i
#---
temp = dic[seller[i]]
# ---
while referral[temp] != "-":
answer[temp] -= profit//10
answer[dic[referral[temp]]] += profit//10
dic[enroll[i]] =i
からdicディレクトリには、名前とインデックスがjohn : 0
で格納されます.ドアから見ると
answer[dic[referral[temp]]]
、tempは現在の売り手のインデックスであるため,[temp]を参照して現在の売り手の親ノードとなる.
dic親ノードとは、親ノードのインデックスを指します.
以下に他の人のコードも添付します.
コード#コード#
マイコード
def solution(enroll, referral, seller, amount):
dic = dict()
answer = [0]*len(enroll)
for i in range(len(enroll)):
dic[enroll[i]] =i
for i in range(len(seller)):
profit =amount[i]*100
temp = dic[seller[i]]
answer[temp] += profit
while referral[temp] != "-":
answer[temp] -= profit//10
answer[dic[referral[temp]]] += profit//10
profit = profit//10
temp = dic[referral[temp]]
if profit<1:
break
answer[temp] -= profit//10
return answer
別の分のコード
import math
def solution(enroll, referral, seller, amount):
parentTree = dict(zip(enroll, referral))
answer = dict(zip(enroll, [0 for i in range(len(enroll))]))
for i in range(len(seller)):
earn = amount[i] * 100
target = seller[i]
while True :
if earn < 10 : #10원 단위 이하라면 모두 받고 레퍼럴 종료
answer[target] += earn
break
else : #10% 레퍼럴을 제외하고 받는다
answer[target] += math.ceil(earn * 0.9)
if parentTree[target] == "-": #상위가 없다면 종료
break
earn = math.floor(earn*0.1)
target = parentTree[target]
return list(answer.values())
import collections
answer = []
node = collections.defaultdict(str)
answer_ = collections.defaultdict(int)
def cal(now, earn):
if now == "-" or earn<1:
return
answer_[now] += earn - earn//10
cal(node[now], earn//10)
def solution(enroll, referral, seller, amount):
for i in range(len(enroll)):
node[enroll[i]] = referral[i]
print(node)
for i in range(len(seller)):
cal(seller[i], amount[i]*100)
for i in range(len(enroll)):
answer.append(answer_[enroll[i]])
return answer
Reference
この問題について([問題解決]プログラマー-多段歯ブラシ販売(ハッシュ)[3級]), 我々は、より多くの情報をここで見つけました https://velog.io/@redcarrot01/ProblemSolving-프로그래머스-다단계-칫솔-판매해시-Level3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol