[programmers]駐車料金の計算


問題の説明


駐車場の料金表と車両進入(入)出(出)記録の場合、車両別に駐車料金を計算したいです.次に例を示します.
  • 運賃表
  • 基本時間(分)基本料金(ウォン)単位時間(分)単位料金(ウォン)1800500010600
  • 入出力記録
  • 時刻(点:分)車番内訳05:345961新車06:00 00000出車06:3400000出車07:5995961出車07:599595961出車07:5990148出車18:5900000出車19:090148出車22:5995959595961出車23:05961出車
  • 自動車駐車料金
  • 车号累计停车时间(分)停车费(元)000034+300=33000+元(334-180)/109600=146000;x 600=146000;67000+元(670-180)/109600=40061145+1=1460000
  • 車両が入車した後に出車しなかった歴史記録があれば、23:59出車と見なす.
    -2000回の車両は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)に乗車した場合は、入力は提供されません.
  • 次の例
  • を含む入力が正しくありません.
  • 駐車場にいない車両が出車する場合
  • 駐車場にすでに車両(ナンバーが同じ車両)が再入車している場合、
  • ソースコード

    import java.util.*;
    
    class Solution {
        
        public int[] solution(int[] fees, String[] records) {
            Map<String, Integer> ansmap = new HashMap<>(); // 누적시간용 Map
            Map<String, Integer> map = new HashMap<>(); // 입,출차 관리용 Map
            for(int i = 0; i < records.length; i++) {
                String[] record = records[i].split(" ");
                // 입차
                if("IN".equals(record[2])) {
                    int intime = Integer.parseInt(record[0].substring(0,2))*60 + Integer.parseInt(record[0].substring(3,5)); // 입차 시간을 분 단위로 변환
                    map.put(record[1], intime);
                }
                // 출차
                else {
                    int outtime = Integer.parseInt(record[0].substring(0,2))*60 + Integer.parseInt(record[0].substring(3,5));
                    int deftime = outtime - map.get(record[1]);
                    // 이미 출차된 적 있던 차라면 기존 시간에 누적
                    if(ansmap.containsKey(record[1])) {
                        int sumtime = ansmap.get(record[1]) + deftime;
                        ansmap.remove(record[1]);
                        ansmap.put(record[1], sumtime);
                    }
                    // 처음 출차되는 것이라면 ansmap에 put
                    else {
                        ansmap.put(record[1], deftime);
                    }
                    map.remove(record[1]);
                }
            }
            
            // 출차 안한 차량 처리
            if(!map.isEmpty()) {
                for(String key : map.keySet()) {
                    int deftime = (23*60+59) - map.get(key);
                    if(ansmap.containsKey(key)) {
                        int sumtime = ansmap.get(key) + deftime;
                        ansmap.remove(key);
                        ansmap.put(key, sumtime);
                    }
                    else {
                        ansmap.put(key, deftime);
                    }
                }
            }
            
            Map<String, Integer> sortedMap = new TreeMap<>(ansmap); // 차량 번호 작은 자동차순으로 정렬
            int[] answer = new int[ansmap.size()];
            int idx = 0;
            for(String key : sortedMap.keySet()) {
                int acctime = sortedMap.get(key);
                // 누적 주차 시간이 기본 시간을 초과하는 경우
                if(acctime > fees[0]) {
                    int sum = fees[1];
                    sum += (acctime-fees[0])%fees[2] == 0 ? (acctime - fees[0])/fees[2]*fees[3] : ((acctime - fees[0])/fees[2]+1) * fees[3];
                    answer[idx++] = sum;
                }
                // 초과하지 않는 경우 기본 요금만 청구
                else {
                    answer[idx++] = fees[1];
                }
            }
            
            return answer;
        }
    }

    Review


    車両番号別に出入りと積算時間を管理するためにHashMapを使用しました.
    ある車は車を出てから再び車に入ることができ、総累計時間を求めた後、最後に料金を報告しなければならない.
    再入車の場合は、現時点で積算するので、地図から車を取り出して戻します.
    最後に車を出さなかった車についても、23:59を基準に車を出して計算します.