문제 링크
주차 요금 계산
풀이
- "그냥 생각없이 하니까 풀렸다"
- 말 그대로 무식하게 반목문 돌면서 조건대로 계산하고, 결과를 따로 받게 하였더니 풀렸다.
- 코드가 아주 더럽다. 한 번 리팩토링을 해야겠지만 지금은...
- Stream을 연습해본답시고 많이 써봤는데 아직도 헤맨다...더 자주 써서 내걸로 만들어야겠다.
public static int[] solution(int[] fees, String[] records) {
Map<String, Integer> recordMap = new HashMap<>();
Map<String, Integer> resultMap = new HashMap<>();
Arrays.stream(records)
.map(record -> record.split(" "))
.forEachOrdered(recordArr -> {
String recordTime = recordArr[0];
int time = Integer.parseInt(recordTime.split(":")[0]) * 60 + Integer.parseInt(recordTime.split(":")[1]);
if (recordArr[2].equals("IN")) {
recordMap.put(recordArr[1], time);
} else {
if (resultMap.containsKey(recordArr[1])) {
resultMap.put(recordArr[1], resultMap.get(recordArr[1]) + (time - recordMap.get(recordArr[1])));
} else {
resultMap.put(recordArr[1], time - recordMap.get(recordArr[1]));
}
recordMap.remove(recordArr[1]);
}
});
if (recordMap.size() > 0) {
recordMap.keySet()
.forEach(number -> resultMap.put(number, resultMap.getOrDefault(number, 0) + (FINAL_TIME - recordMap.get(number))));
}
List<Integer> resultFee = new ArrayList<>();
int defaultTime = fees[0];
int defaultFee = fees[1];
int unitTime = fees[2];
int unitFee = fees[3];
resultMap.keySet().stream()
.sorted()
.map(resultMap::get)
.forEachOrdered(sumOfTime -> {
if (sumOfTime <= defaultTime){
resultFee.add(defaultFee);
} else {
resultFee.add(defaultFee + ((int) Math.ceil((sumOfTime - (double) defaultTime) / unitTime)) * unitFee);
}
});
return resultFee.stream()
.mapToInt(Integer::intValue)
.toArray();
}