본문 바로가기

프로그래머스(Java)/Level 2

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

728x90

코드 힌트

  1. 기록 관리:
    • 각 차량의 입차 및 출차 시간을 관리하여, 차량이 얼마나 오랫동안 주차했는지를 계산합니다.
    • 출차 기록이 없는 차량은 마지막 시간인 23:59에 자동으로 출차 처리됩니다.
  2. 요금 계산:
    • 차량이 기본 시간 이하로 주차한 경우, 기본 요금만 부과됩니다.
    • 기본 시간을 초과한 경우, 추가 시간에 대해 단위 요금을 적용하여 최종 요금을 계산합니다.
    • 추가 시간 계산 시, (현재 시간 - 주차 시간 - 기본 주차 시간) / 추가 시간 단위가 소수점으로 나누어떨어지지 않으면 올림 처리를 해야 합니다.
  3. 입출차 처리:
    • 차량이 입차할 때는 해당 차량의 입차 시간을 기록합니다.
    • 차량이 출차할 때는 현재 시간과 입차 시간의 차이를 이용해 총 주차 시간을 계산하고 기록합니다.
    • 출차가 완료된 후, 차량의 입차 기록은 삭제됩니다.
  4. 최종 결과:
    • 모든 차량의 주차 시간이 계산된 후, 차량 번호를 오름차순으로 정렬합니다.
    • 각 차량의 주차 요금을 계산하여 최종 결과로 반환합니다.

 


정답은 더보기 클릭

더보기
import java.util.*;

class Solution {
    static HashMap<String, Integer> parkingInTime; // 차량이 입차된 시간을 기록하는 맵
    static HashMap<String, Integer> parkingTotalTime; // 차량의 총 주차 시간을 기록하는 맵
    static Set<String> vehicleSet; // 차량 번호 중복 체크를 위한 세트

    public int[] solution(int[] fees, String[] records) {
        parkingInTime = new HashMap<>();
        parkingTotalTime = new HashMap<>();
        vehicleSet = new HashSet<>();
        
        // 모든 기록을 순차적으로 처리
        for (String record : records) {
            String[] infoArr = record.split(" ");
            String[] curTime = infoArr[0].split(":");
            String number = infoArr[1];
            boolean isEnter = infoArr[2].equals("IN");
            int curMinutes = Integer.parseInt(curTime[0]) * 60 + Integer.parseInt(curTime[1]);
            
            if (isEnter) {
                carIn(number, curMinutes);
            } else {
                carOut(number, curMinutes);
            }
        }
        
        // 출차 기록이 없는 차량을 23:59에 출차 처리
        List<String> vehicleList = new ArrayList<>(vehicleSet);
        for (String number : vehicleList) {
            carOut(number, 1439); // 23:59에 출차
        }

        // 차량 번호를 오름차순으로 정렬
        Collections.sort(vehicleList);
        int[] result = new int[vehicleList.size()];
        
        // 각 차량의 총 주차 시간을 바탕으로 요금 계산
        for (int i = 0; i < vehicleList.size(); i++) {
            String number = vehicleList.get(i);
            result[i] = calculateFare(fees, parkingTotalTime.get(number));
        }
        
        return result;
    }

    // 요금 계산 메소드
    public static int calculateFare(int[] fees, int time) {
        int baseTime = fees[0];
        int baseFare = fees[1];
        int unitTime = fees[2];
        int unitFare = fees[3];

        if (time <= baseTime) {
            return baseFare;
        }

        int extraTime = time - baseTime;
        int additionalFare = (int) Math.ceil((double) extraTime / unitTime) * unitFare;

        return baseFare + additionalFare;
    }

    // 입차 처리 메소드
    public static void carIn(String number, int curMinutes) {
        parkingInTime.put(number, curMinutes);
        vehicleSet.add(number);
    }

    // 출차 처리 메소드
    public static void carOut(String number, int curMinutes) {
        if (parkingInTime.containsKey(number)) {
            int inTime = parkingInTime.get(number);
            parkingInTime.remove(number);

            parkingTotalTime.put(number, parkingTotalTime.getOrDefault(number, 0) + curMinutes - inTime);
        }
    }
}
728x90