[プログラマー]駐車料金の計算



📩 -->問題の説明


駐車場の料金表と車両進入(入)出(出)記録の場合、車両別に駐車料金を計算したいです.次に例を示します.
  • 車両が入車した後に出車しなかった歴史記録があれば、23:59出車と見なす.
  • 0000台の車両は18:59に駅に入った後、駅を出た記録がない.そのため、23:59に咲いたと思います.
  • 00:00から23:59までの入車/出車履歴に基づき、各車両の累計駐車時間を計算し、料金を統一的に決済する.
  • の累計駐車時間がデフォルト時間を下回った場合、デフォルト料金が徴収されます.
  • の累計駐車時間がデフォルト時間を超えた場合、デフォルト料金を除き、超えた時間は単位時間で料金を徴収します.
  • を超える時間が単位時間で分離されない場合は、それを高くします.
  • aより小さい最小整数を表す.これは向上を意味します.パラメータは、駐車料金を表す整数配列です.文字列配列recordsは、自動車の入/出履歴を表します.解関数を完了し、ナンバープレートの小さい車から、清算する駐車料金を整数配列に順番に戻してください.

    せいげんじょうけん

  • 費用長=4
  • 費用[0]=デフォルト時間(分)
  • 1 ≤ fees[0] ≤ 1,439
  • 費用[1]=基本費用(ウォン)
  • 0 ≤ fees[1] ≤ 100,000
  • 料金[2]=単位時間(分)
  • 1 ≤ fees[2] ≤ 1,439
  • 費用[3]=単位費用(ウォン)
  • 1 ≤ fees[3] ≤ 10,000
  • 1≦recordsの長さ≦1000
  • recordsの各要素は、「可視車両番号履歴」形式の文字列です.
  • 時点で、ナンバープレートと履歴はスペースで区切られています.
  • 時刻は、車両が進入または離脱した時刻を示す文字列であり、長さは5(HH:MM)である.
  • HH:MM 00:00から23:59まで.
  • 入力が正しくありません(「25:22」,「09:65」など).
  • 車両番号は長さ4の文字列で、「0」から「9」で構成され、自動車を区別するために使用されます.
  • 履歴は、INまたはOUTの長さ2または3の文字列です.IN代表入車OUT代表出車
  • recordsの要素は、視点の昇順に並べられています.
  • recordsは1日の入車/出車記録のみを含み、入車した車両が翌日出車した場合は入力としない.
  • 同一時刻、同一車両番号の履歴は2回を超えない.
  • の最後の瞬間(23:59)に乗車した場合は、入力は提供されません.
  • 次の例
  • を含む入力が正しくありません.
  • 駐車場にいない車両が出車する場合
  • 駐車場にすでに車両(ナンバーが同じ車両)が再入車している場合、
  • I/O例


    feesrecordsresult[180, 5000, 10, 600]["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"][14600, 34400, 5000][120, 0, 60, 591]["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"][0, 591][1, 461, 1, 10]["00:00 1234 IN"][14841]

    💡 ソリューション(使用言語:python)

    import math
    def solution(fees, records):
        basic_minute = fees[0]
        basic_fee = fees[1]
        minute = fees[2]
        unit = fees[3]
    
        car = list(set(map(lambda x: x.split()[1], records)))
        total_fees = {k : 0 for k in car}
        check = {}
        for record in records:
            tmp = record.split(' ')
            if tmp[1] not in check.keys():
                check[tmp[1]]= tmp[0]
            else:
                if tmp[-1] == 'OUT':
                    out_time = int(tmp[0].split(':')[0]) * 60 + int(tmp[0].split(':')[1])
                    in_time = int(check[tmp[1]].split(':')[0]) * 60 + int(check[tmp[1]].split(':')[1])
                    total_fees[tmp[1]] = total_fees[tmp[1]] + out_time - in_time
                    del check[tmp[1]]
    
        if check:
            for i in check.keys():
                out_time = 1439
                in_time = int(check[i].split(':')[0]) * 60 + int(check[i].split(':')[1])
                total_fees[i] = total_fees[i] + out_time - in_time
    
        result = []
        for i in total_fees.items():
            if i[1] <= basic_minute :
                result.append((i[0], basic_fee))
            else:
                result.append((i[0], basic_fee + (math.ceil((i[1] - basic_minute) / minute) * unit)))
    
        return list(map(lambda x: x[1], sorted(result)))

    👉 説明:

  • は基本的にナンバープレートをキーに、累計時間を価値とするtotal_feesディックシリーズを作成しています.
  • INOUTを比較できるCheckがもう一つ
  • レコードから1つの値を抽出すると、分割されたリストがtmpに格納される.
  • ['05:34', '5961', 'IN']
  • tmp[1]、すなわち、ナンバープレートがcheckのキー値に含まれていない場合、駐車場ではINであるため、tmp[1]をキーとしてその値をtmp[0]に追加する.
  • tmp[1]がcheckのキー値に存在する場合はOUTであるため、時間差はtotal_feesのtmp[1]をキーとする値で既存値に加えられる.
  • total_fees[tmp[1]] = total_fees[tmp[1]] + out_time - in_time
  • そしてcheckからtmpを削除する[1].
  • このプロセスを繰り返すと、
  • の各車の累積駐車時間は1つの値として計算されます.
  • しかしOUTのない車は単独で比較する必要があり、Checkに要因があればその車の積算駐車時間を増やすためにtotal_feesの値に1439(total_fees)-In timeから減算した値を加算する.
  • 以降、計算は費用の価格と比較される.

  • 🌈 に感銘を与える


    今年出た温熱問題なので、解決する人はまだ少ないようです.もっと親切に説明する習慣を身につけるべきだと思います!
    ソース:プログラマ
    間違いがあればメッセージをお願いします🙂