본문 바로가기
Java/알고리즘

[Java] 프로그래머스 Lv2 - 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산

by WaterPunch 2024. 12. 6.

import java.util.*;

public class Solution {

    private int[] solution(int[] fees, String[] records) {
        // 문제에서 제시받은 기본시간, 기본요금, 단위시간, 단위요금
        int defaultTime = fees[0];
        int defaultFee = fees[1];
        int calTime = fees[2];
        int fee = fees[3];

        // 차량이 IN, OUT한 기록을 저장해놓는 Map
        // 배열[0] = IN 시간
        // 배열[1] = OUT 시간, OUT 기록이 없다면 null
        HashMap<String, ArrayList<Integer[]>> carMap = new HashMap<>();

        // 문제에서 제시받은 입출차 기록을 Map에 put
        for(String record : records) {
            String[] split = record.split(" ");
            String time = split[0];
            String[] hourMinutes = time.split(":");
            // 입출차 시간을 int형으로 변환 (01:30 -> 90)
            int timeToInt =
                    (Integer.parseInt(hourMinutes[0]) * 60)
                    + Integer.parseInt(hourMinutes[1]);
            String carNum = split[1];
            boolean isIn = split[2].equals("IN");

            // 해당차량의 입차 기록이 없다면 Map에 기본 List 생성
            // 입차 기록이 있다면 해당 차량의 기록 list를 get
            ArrayList<Integer[]> list = carMap.getOrDefault(carNum, new ArrayList<>());
            if (isIn) {
                // 입차 기록을 list에 추가후 map 업데이트
                list.add(new Integer[]{timeToInt, null});
                carMap.put(carNum, list);
            } else {
                // 출차시간 업데이트
                Integer[] timeArr = list.get(list.size() - 1);
                timeArr[1] = timeToInt;
            }
        }

        // 입출차한 기록이 있는 차량번호(Map key)를 list로 만든 뒤 오름차순 정렬
        ArrayList<String> carList = new ArrayList<>(carMap.keySet());
        Collections.sort(carList, Comparator.comparingInt(Integer::parseInt));
        int[] answer = new int[carList.size()];

        int seq = 0;
        // 차량번호순으로 answer에 추가
        for (String car : carList) {
            // 하루동안 주차한 총시간
            int timeSum = 0;
            // 맵에 저장해놓은 list get
            ArrayList<Integer[]> timeTables = carMap.get(car);

            for(int i=0; i<timeTables.size(); i++) {
                Integer[] timeTableArr = timeTables.get(i);
                // 출차시간 - 입차시간 계산 (출차 기록이 없다면 23:59을((60 * 24) + 59 = 1439) 기준으로 계산)
                timeSum += (timeTableArr[1] == null ? 1439 - timeTableArr[0] : timeTableArr[1] - timeTableArr[0]);
            }
            // 단위시간을 1분이라도 초과시 단위요금 추가
            double needPayTurn = Math.ceil((double) (timeSum - defaultTime) / calTime);
            answer[seq] = (timeSum - defaultTime) <= 0 ? defaultFee : (int)(defaultFee + (needPayTurn * fee));
            seq++;
        }

        return answer;
    }
}
반응형

댓글