Algorithm
프로그래머스
Java
주차 요금 계산

주차 요금 계산

https://school.programmers.co.kr/learn/courses/30/lessons/92341 (opens in a new tab)

풀이

풀기는 했는데, 정해진 시간 안에 풀지 못하고 디버깅을 사용했다. 그래서 틀린 문제로 취급.

주의해서 봐야할 부분은 다음과 같다.

  • Map을 forEach로 할 때 (key, value)를 사용할 수 있다.
  • 시간을 계산할 때, 분에서 시간으로 갈 때 endH --; 해주는게 아니라 startH --;를 해줘서 답이 이상하게 나왔다.
  • 차량 번호를 기준으로 오름차순 정렬해야한다는 조건이 문제에 있었는데 자연스럽게 스킵한 것 같다.
class Solution {
    public int[] solution(int[] fees, String[] records) {
        HashMap<String, String> ps = new HashMap<>();
        HashMap<String, Integer> useTime = new HashMap<>();
 
        for (String r : records) {
            String[] temp = r.split(" ");
            String time = temp[0];
            String carN = temp[1];
            String command = temp[2];
 
            if (command.equals("IN")) {
                ps.put(carN, time);
            } else {
                String start = ps.get(carN);
                Integer use = subtractTime(start, time);
                Integer rest = useTime.getOrDefault(carN, 0);
                ps.remove(carN);
                useTime.put(carN, rest + use);
            }
        }
 
        ps.forEach((key, value) -> {
            String start = ps.get(key);
            Integer use = subtractTime(start, "23:59");
            Integer rest = useTime.getOrDefault(key, 0);
            useTime.put(key, rest + use);
        });
 
        int[] ans = useTime.entrySet()
                .stream()
                .sorted(Map.Entry.comparingByKey())
                .map(
                        e -> {
                            int fee = 0;
                            fee += fees[1];
                            int curUse = e.getValue();
                            if (fees[0] < curUse) {
                                curUse -= fees[0];
                                int div = curUse / fees[2];
                                div += curUse % fees[2] == 0 ? 0 : 1;
                                fee += div * fees[3];
                            }
                            return fee;
                        }
                )
                .mapToInt(Integer::intValue)
                .toArray();
        return ans;
    }
 
    public Integer subtractTime(String start, String end) {
        Integer startH = Integer.parseInt(start.split(":")[0]);
        Integer startM = Integer.parseInt(start.split(":")[1]);
        Integer endH = Integer.parseInt(end.split(":")[0]);
        Integer endM = Integer.parseInt(end.split(":")[1]);
 
        Integer restM = endM - startM;
        if (restM < 0) { // 만약 시간이 음수가 나올경우
            endH--;
            restM = 60 + restM;
        }
 
        Integer restH = endH - startH;
        restM += restH * 60;
 
        return restM;
    }
}