[2022 KAKAO BLIND RECRUITMENT - 주차 요금 계산]
https://school.programmers.co.kr/learn/courses/30/lessons/92341
[접근 방법]
1. 'hh:mm' 형식의 시간을 '분' 단위로 변환한다.
ex ) 13:22 => 13 * 60 + 22 = 802 (분)
2. IN(입차) 일 경우, 누적 시간에 시간을 마이너스(-) 한다.
OUT(출차) 일 경우, 누적 시간에 시간을 플러스(+) 한다.
3. 누적 시간이 0 이하 일 경우, 출차 하지 않은 것으로 간주하고, 누적 시간에 "23:59" 를 더해준다.
4. key 값인 차번호를 오름차순으로 정렬한다.
5. value 인 누적 시간을 key 값 순서대로 '분' 단위의 누적 시간을 요금으로 변환한다.
[Java 코드]
import java.util.*;
public class PM_92341 {
//시간을 '분' 단위로 변환
// hh:mm -> mm
private int toMinute(String t) {
String[] arr = t.split(":");
return Integer.parseInt(arr[0]) * 60 + Integer.parseInt(arr[1]);
}
//시간 -> 요금으로 변환
// time -> fee
private int toFee(int t, int[] fees) {
if (t < fees[0]) {
return fees[1];
}
// 기본요금 + 추가시간 * 단위 요금
return fees[1] + ((t - fees[0] + fees[2] - 1) / fees[2]) * fees[3];
}
/*
* fees : [기본 시간, 기본 요금, 단위 시간, 단위 요금]
* records[n] : "시간 차번호 IN/OUT"
* result : 차량 번호가 작은 자동차부터 요금 출력
*/
public int[] solution(int[] fees, String[] records) {
Map<String, Integer> map = new HashMap<>();
for (String r : records) {
StringTokenizer st = new StringTokenizer(r);
int time = toMinute(st.nextToken()); // min 단위 시간
String num = st.nextToken();
String type = st.nextToken();
//누적 시간 계산
if (type.equals("IN")) {
map.put(num, map.getOrDefault(num, 0) - time);
} else { // OUT
map.put(num, map.getOrDefault(num, 0) + time);
}
} // for 문
//누적 시간이 0 이하 일 경우 마지막 출차를 안한 것으로 계산
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() <= 0) {
entry.setValue(entry.getValue() + toMinute("23:59"));
}
}
// 차량 번호 정렬
List<String> keySet = new ArrayList<>(map.keySet());
Collections.sort(keySet);
// 결과를 List<Integer>에 담기
List<Integer> answer = new ArrayList<>();
for (String key : keySet) {
//누적 시간을 요금으로 변환
answer.add(toFee(map.get(key), fees));
}
// List<Integer>를 int[] 배열로 변환
int[] result = answer.stream().mapToInt(Integer::intValue).toArray();
return result;
}// solution
}
[Rewind]
1. 어려웠던 점
- 시간을 요금으로 변경하는 메서드 (toFee) 를 구현할때, 올림을 고려하는 것이 좀 까다로웠다.
ex ) 기본시간 180, 기본요금 5000, 추가시간 단위 10, 추가 단위금액 800
차량번호 0000 의 누적 시간이 5시간 38분 이라면,
5시간 38분 -> 5 * 60 + 38 = 338
180 분에 대한 기본 요금은 5000원 이다.
기본요금 : 5000원
158 분에 대한 추가 요금은
150 분에 대해 15 * 800 = 12000원
8 분에 대해 올림을 하여 800원
추가요금 : 12800원
총 요금 : 17800
무조건 올림 부분이 까다로웠는데,
기본 시간을 제외한 추가 시간 '158' 에 '추가시간단위 - 1' 을 하여, 무조건 올림을 구현했다.
(158 + 10 - 1) / 10 * 800 = 16 * 800 = 12800
2. 알게된 점
- HashMap 에서 entry 를 추출하는 방법
- 추출한 entry 에서 entry.getValue() / entry.setValue() 를 이용하여 곧바로 수정하는 방
3. 개선 방안
- 문제의 해결방식을 통해 가장 효과적인 자료구조를 적용할 줄 알아야 한다.
- 단순하고 견고한 방식으로 효과적으로 논리구조를 구성해야 한다.