[코테/JAVA] 2022 KAKAO BLIND RECRUITMENT : 주차 요금 계산

    728x90
    반응형

    2022.12.24

    코테 문제풀이 23주차 04번 문제

     

     

    문제

     

     

    프로그래머스

    코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

    programmers.co.kr

     

     

    접근방법

     문제 그대로 풂

     

     

    풀이

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
     
    class Solution {
        /*
         * Date: 2022-12-29
         * Time: 20:07
         */
        public int[] solution(int[] fees, String[] records) {
            return calcParkingFees(fees, records);
        }
     
        /**
         * 주차 요금 계산
         * @param fees 주차 요금을 나타내는 정수 배열
         * @param records 자동차의 입/출차 내역을 나타내는 문자열 배열
         * @return 차량 번호가 작은 자동차부터 청구할 주차 요금을 나타내는 정수 배열
         */
        public int[] calcParkingFees(int[] fees, String[] records) {
            /*
             * @Desc
             * 1.records를 String.split()로 자른 후, 첫번째 인덱스에 들어있는 시간을 시간과 분으로 자른다.
             * 2.입출을 기록하는 recordMap과 누적주차시간을 기록하는 calcMap을 선언 및 초기화한다.
             * 3.입차와 출차의 건 수가 같으면 recordMap.차량번호의 값을 null로 초기화하고 calcMap에 누적주차시간을 누적한다.
             * 4.출차 기록이 없는 건들은 23:59분을 출차시간으로 기록해 계산한다.
             * 5.Compartor.compare() 메소드를 오버라이딩해서 차량번호를 기준으로 오름차순 정렬한다.
             * 6.요금표를 기준으로 주차요금을 계산한다.
             */
            Map<String, Long> calcMap = new HashMap<>();
            Map<String, Long> recordMap = new HashMap<>();
     
            for (String record: records) {
                String[] oneRowSplit = record.split(" ");
                String[] timeSplit = oneRowSplit[0].split(":");
                long time = Long.parseLong(timeSplit[0]) * 60 + Long.parseLong(timeSplit[1]);
     
                if (recordMap.get(oneRowSplit[1]) == null)
                    recordMap.put(oneRowSplit[1], time);
                else {
                    time -= recordMap.get(oneRowSplit[1]);
     
                    if (calcMap.get(oneRowSplit[1]) == null)
                        calcMap.put(oneRowSplit[1], time);
                    else
                        calcMap.put(oneRowSplit[1], calcMap.get(oneRowSplit[1]) + time);
     
                    recordMap.put(oneRowSplit[1], null);
                }
            }
     
            recordMap.forEach((key, value) -> {
                if (value != null) {
                    long endTime = 60*23 +59;
                    long time = endTime - value;
                    if (calcMap.get(key) == null)
                        calcMap.put(key, time);
                    else
                        calcMap.put(key, calcMap.get(key) + time);
                }
            });
     
            List<Entry<String, Long>> entryList = new LinkedList<>(calcMap.entrySet());
            entryList.sort(new Comparator<Map.Entry<String, Long>>() {
                @Override
                public int compare(Entry<String, Long> o1, Entry<String, Long> o2) {
                    return Integer.parseInt(o1.getKey()) - Integer.parseInt(o2.getKey());
                }
            });
     
            // Output Instance
            int[] output = new int[calcMap.size()];
     
            int index = 0;
            int baseTime = fees[0];
            int baseRate = fees[1];
            int unitTime = fees[2];
            int unitRate = fees[3];
            for (Map.Entry<String, Long> entry: entryList) {
                long parkingFee = 0;
                parkingFee = entry.getValue() - baseTime > 0 ? entry.getValue() - baseTime : 0;
                parkingFee = parkingFee%unitTime==0 ? parkingFee/unitTime : (parkingFee/unitTime) +1;
                parkingFee *= unitRate;
                parkingFee += baseRate;
     
                output[index++= (int)parkingFee;
            }
            return output;
        }
    }
    cs

     

     

    결과

    728x90
    반응형

    댓글