구현 문제
문제링크
풀이 접근
- 해시맵으로 구현을 하려고 했는데 키 해시맵의 경우 차량번호의 정렬 문제가 있었다. -> TreeMap이라는 구조를 사용하면 키 값이 정렬되어 쓸 수 있다!
- 해당 자료구조를 사용하면 정렬을 따로 구현할 필요가 없어진다
- IN일 경우 키 값 + 시간을 저장해 뒀다가 OUT일 경우 분으로 계산한 후 두 번째 TreeMap 에 넣어준다.
- 해당 데이터는 쓸 모가 없으니 삭제해준다 왜냐하면 또 주차하러 올 수 있기 때문이다.
- OUT 데이터가 없이 IN 데이터만 있을 경우 23:59에 OUT으로 일괄처리해준다.
- 트리맵의 경우 키값이 정렬되어 순서대로 나오는데 이 때 기본요금이 초과하는지 확인일 한 후 기본요금 시간이 초과되지 않는 경우는 기본요금으로 일괄 처리해서 ArrayList에 넣어준다.
- 기본요금을 추가해줄 경우 fees에 있는 데이터데로 처리해준다.
- 마지막으로 리턴 타입에 맞게 다시 만들어서 출력해주면 끝
구현 코드
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;
class Solution {
public int[] solution(int[] fees, String[] records) {
TreeMap<String, String> map = new TreeMap<>();
TreeMap<String, Integer> result = new TreeMap<>();
for (int i = 0; i < records.length; i++) {
String[] list = records[i].split(" ");
if (list[2].equals("IN")) {
map.put(list[1], list[0]);
} else {
String[] time = map.get(list[1]).split(":");
// IN
int hour = Integer.parseInt(time[0]);
int min = Integer.parseInt(time[1]);
int total_1 = hour * 60 + min;
// OUT
String[] time2 = list[0].split(":");
int hour2 = Integer.parseInt(time2[0]);
int min2 = Integer.parseInt(time2[1]);
int total_2 = hour2 * 60 + min2;
int parkingTime = total_2 - total_1;
result.put(list[1], result.getOrDefault(list[1], 0) + parkingTime); // 이 부분을 수정
map.remove(list[1]);
}
}
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
String[] time = value.split(":");
int hour = Integer.parseInt(time[0]);
int min = Integer.parseInt(time[1]);
int total_1 = hour * 60 + min;
int parkingTime = 1439 - total_1;
result.put(key, result.getOrDefault(key, 0) + parkingTime); // 이 부분을 수정
}
ArrayList<Integer> list = new ArrayList<>();
for (Map.Entry<String, Integer> entry:result.entrySet()) {
if (entry.getValue() <= fees[0]) {
list.add(fees[1]);
} else {
int fee = fees[1] + (int) Math.ceil((entry.getValue() - fees[0]) / (double) fees[2]) * fees[3];
list.add(fee);
}
}
int[] intArray = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
intArray[i] = list.get(i);
}
return intArray;
}
}
정리
- 맨 처음에 Null 포인트 처리를 잘못해서 로컬IDE에서는 통과했지만 제출했을 경우 에러가 났다.
- 해시맵의 경우 Null 값의 처리를 주의하자!
댓글남기기