[프로그래머스] LV2. 주차 요금 계산

인스·2025년 8월 1일

💡풀이

  • 차량 내역이 담긴 배열(records) 순회하면서 treeMap에 각 차량번호와 누적 시간 담기
    => 시간을 분단위로 계산 후, IN일 경우는 더하기, OUT일 경우는 빼기
  • treeMap에 저장된 누적 시간에 따라 요금 계산하기
    => 누적 시간이 양수이면 OUT이 없는 차량이므로 23:59으로 OUT 계산 후 treeMap에 넣기
    => 요금 계산 후 배열에 넣기 (calFees 함수)

👍🏼 원래는 HashMap에 넣고 Key 기준으로 정렬하려고 했는데 TreeMap이 생각나서 다시 수정함 ! (TreeMap : Key 기준으로 자동 정렬)
🚨 주의 ) Math.ceil로 올림할 때 Double형으로 계산하고 올림해야함 (int형으로 나눗셈하면 안됨)

import java.util.*;

class Solution {
    static int defTime, defFee, unitTime, unitFee;
    public int[] solution(int[] fees, String[] records) {
        defTime = fees[0];
        defFee = fees[1];
        unitTime = fees[2];
        unitFee = fees[3];
        
        // treeMap에 차량번호와 각각 시간 담기
        Map<String, Integer> recMap = new TreeMap<>();
        for(String record : records){
            String[] str = record.split(" ");
            // 분 단위로 변경
            String[] time = str[0].split(":");
            int minute = Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
            
            // 누적 시간 구하기
            if (str[2].equals("IN")){ // IN일 경우 시간 더하기
                 recMap.put(str[1], recMap.getOrDefault(str[1], 0) + minute);
            } else { // OUT일 경우 시간 빼기
                recMap.put(str[1], recMap.getOrDefault(str[1], 0) - minute);
            }
        }
        
        // treeMap에 각 차량번호에 따라 누적 시간 요금 계산
        int idx = 0;
        int[] answer = new int[recMap.size()];  // 결과 배열
        for(String rec : recMap.keySet()){
            if (recMap.get(rec) >= 0){  // OUT이 입력되지 않았으면 23:59을 OUT으로 계산하기
                recMap.put(rec, recMap.get(rec) - (23 * 60 + 59));
            }
            // 요금 계산 후 배열에 넣기
            answer[idx++] = calFees(recMap.get(rec) * -1);
        }
        
        return answer;
    }
    
    public int calFees(int time){
        if (time < defTime) return defFee;
        return defFee + (int)Math.ceil(Double.valueOf(time - defTime) / Double.valueOf(unitTime)) * unitFee;
    }
}
profile
💻💡👻

0개의 댓글