プログラマー[Kakao]駐車料金の計算(Java)


リンク


質問リンク

問題の説明


駐車場の料金表と車両進入(入)出(出)記録の場合、車両別に駐車料金を計算したいです.次に例を示します.
  • 料金表
  • 出入り記録
  • 駐車料金
  • 車両が入車しても出車しない明細があれば、23:59出車とみなす.
  • 0000次車両は18:59に駅に入った後、駅を出る記録がない.そのため、23:59に咲いたと思います.
  • 00:00から23:59までの入出車履歴に基づき、1台あたりの積算駐車時間を計算し、料金を一括して精算する.
  • 積算停車時間が基本時間を下回る場合は、基本料金を徴収します.
  • 積算駐車時間が基本時間を超えている場合は、基本料金を除き、超えた時間については単位時間ごとに料金を徴収する.
  • タイムアウトが単位時間間隔でない場合はそれを上げる.
  • 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≦記録長≦1000
  • recordsの各要素は「可視化車両番号履歴」形式の文字列である.
  • 時刻・車両番号・履歴が1つのスペースに区切られている.
  • 時刻は、車両の乗り入れ時刻または出車時刻を表し、HH:MM形式の長さ5の文字列である.
  • HH:MM 00:00から23:59まで.
  • 入力が間違った視点を与えない(「25:22」、「09:65」など).
  • ナンバープレートは「0」から「9」までの長さ4の文字列で、自動車を区別する.
  • 履歴は長さ2または3の文字列でINまたはOUTである.IN代表入車OUT代表出車
  • recordsの要素は、視角単位で昇順に並べられている.
  • recordsは1日の入車/出車記録のみを含み、入車車両が翌日出車した場合は入力としない.
  • 同一時刻、同一車両番号の明細は2回を超えない.
  • 最終時刻(23:59)に入ると入力としない.
  • 次の例を含む誤った入力はありません.
  • 駐車場にいない車両の出車
  • 駐車場に既に車両(ナンバープレートが同じ車両)が入っている場合
  • I/O例説明


    リンク参照

    に答える

  • 問題では車両番号が小さい順に回答を記入するよう求められているので、まず与えられた記録に基づいて車両番号を昇順に並べ替える.
  • 1回のプロセスで、車両番号の変化状況をチェックし、一致して回答を追加することができます.
  • 車両が「OUT」であるかどうかをチェックするin変数と、タイマと文字列のサブ文字列を含む残りの変数を発表した.
  • forゲートでは、車両番号が変更された場合、final time値で費用を計算しansに追加します.そうしないとfinal time変数に累積使用時間が格納されます.
  • 複文終了後、最後の車両について単独で費用計算を行って終了する.
  • 問題を見始めたばかりの頃、どのような方法で解決すればいいか悩んでいました.
    Kakaoの文字列問題はいつも問題を解く展開が重要らしい.でもいつもそれを思い出せない
    この問題は集中さえすれば、自分のやり方で解決できるのだろうか.実施が完了すると、テストケースは1回で合格します.
     import java.util.*;
    class Solution {
        public int[] solution(int[] fees, String[] records) {
            List<Integer> ans = new ArrayList();
            int[] answer = {};
            Arrays.sort(records, new Comparator<String>() {
                @Override
                public int compare(String s1, String s2) {
                    return s1.substring(6, 10).compareTo(s2.substring(6,10));
                }
            });
            boolean in = false;
            int time = 0, final_time = 0;
            String time_info, in_or_out;
            String car_number = records[0].substring(6,10);
            for(int i = 0; i < records.length; i++) {
                time_info = records[i].substring(0,5);
                if(!car_number.equals(records[i].substring(6,10)))
                {
                    if(in) 
                    {
                        final_time += 23 * 60 + 59 - time;
                        in = false;
                    }
                    if(final_time <= fees[0])
                        ans.add(fees[1]);
                    else
                        ans.add(fees[1] + (int)Math.ceil((double) (final_time - fees[0]) / fees[2]) * fees[3]);
                    car_number = records[i].substring(6,10);
                    final_time = 0;
                }
                in_or_out = records[i].substring(11,12);
                int hour = Integer.parseInt(records[i].substring(0,2)) * 60;
                int min = Integer.parseInt(records[i].substring(3,5));            
                if(in_or_out.equals("I")) {
                    time = hour + min;
                    in = true;
                }
                else {
                    final_time += hour + min - time;
                    in = false;
                }
            }
            if(in) {
                final_time += 23 * 60 + 59 - time;
                in = false;
            }
            if(final_time <= fees[0])
                ans.add(fees[1]);
            else
                ans.add(fees[1] + (int)Math.ceil((double) (final_time - fees[0]) / fees[2]) * fees[3]);
            return ans.stream().mapToInt(k -> k).toArray();
        }
    }