주차 요금 계산
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;
}
}