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

주차 요금 계산

by 티코딩 2023. 11. 8.

문제 설명

문제가 엄청 길다.

풀기위해서 먼저 차량번호가 낮은 순서대로, 누적시간을 알아낸뒤 계산을 하면 된다.

ㅇ 코드

 public static int[] solution(int[] fees, String[] records) {
		
        Map<String, Integer> parkingTimes = calculateParkingTime(records);
        //차량번호를 낮은순으로 정리하기 위한 TreeMap<>
        TreeMap<String, Integer> sortedParkingTimes = new TreeMap<>(parkingTimes);
        //answer 에 누적시간만 차례로 넣기.
        int[] answer = sortedParkingTimes.values().stream()
                .mapToInt(Integer::intValue)
                .toArray();
        //누적시간 구한거에 계산식 입히기        
        for(int i = 0; i < answer.length; i++){
            if(answer[i] <= fees[0]){
                answer[i] = fees[1];
            } else {
                int totalTime = (int) (Math.ceil((double) (answer[i] - fees[0]) / fees[2]));
                answer[i] = fees[1] + totalTime * fees[3];
            }
        }
        return answer;
    }
    //주어진 records에서 split으로 시간, 차량번호, 입차or출차 구하고
    //IN, OUT 기준으로 calculateDifference로 누적시간 구하는 메서드
    public static Map<String, Integer> calculateParkingTime(String[] records) {
        Map<String, Integer> parkingTimes = new HashMap<>();
        Map<String, String> entryRecords = new HashMap<>();
        Map<String, Boolean> parkingStatus = new HashMap<>();

        for (String record : records) {
            String[] parts = record.split(" ");
            String time = parts[0];
            String vehicleNumber = parts[1];
            String eventType = parts[2];

            if (eventType.equals("IN")) {
                entryRecords.put(vehicleNumber, time);
                parkingStatus.put(vehicleNumber, true);
            } else if (eventType.equals("OUT")) {
                String entryTime = entryRecords.get(vehicleNumber);
                Boolean isParked = parkingStatus.get(vehicleNumber);
                if (entryTime != null && isParked != null && isParked) {
                    int parkingTime = calculateTimeDifference(entryTime, time);
                    parkingTimes.put(vehicleNumber, parkingTimes.getOrDefault(vehicleNumber, 0) + parkingTime);
                    entryRecords.remove(vehicleNumber);
                    parkingStatus.put(vehicleNumber, false);
               
            }
        }
        //IN만 있고 OUT은 없을때, 23:59에 출차 했다고 치고 계산
        for (Map.Entry<String, String> entry : entryRecords.entrySet()) {
            int parkingTime = calculateTimeDifference(entry.getValue(), "23:59");
            parkingTimes.put(entry.getKey(), parkingTimes.getOrDefault(entry.getKey(), 0) + parkingTime);
        }

        return parkingTimes;
    }
    //얼마나 주차했는지 시간계산 해주는 메서드
    //calculateTimeDifference("13:00","13:01") 하면 1반환
    public static int calculateTimeDifference(String startTime, String endTime) {
        String[] startParts = startTime.split(":");
        String[] endParts = endTime.split(":");
        int startHour = Integer.parseInt(startParts[0]);
        int startMinute = Integer.parseInt(startParts[1]);
        int endHour = Integer.parseInt(endParts[0]);
        int endMinute = Integer.parseInt(endParts[1]);

        int totalStartMinutes = startHour * 60 + startMinute;
        int totalEndMinutes = endHour * 60 + endMinute;

        return totalEndMinutes - totalStartMinutes;
    }

 

'Java > 알고리즘' 카테고리의 다른 글

뒤에 있는 큰 수 찾기  (0) 2023.11.22
주식 가격  (1) 2023.11.21
더맵게(Priority Queue, Min Heap)  (0) 2023.11.02
모음사전  (0) 2023.11.01
알고리즘 공부(3) - 완전탐색을 알아보자  (1) 2023.10.31