문제
문제풀이
카카오 문제인데 시물레이션 문제를 내면 엄청나게 시간을 많이 잡아 먹힌다. 일단 차량의 IN과 OUT에 따라 맵에 들어있는 시간을 빼주고 더해줘야 한다. 그렇게 다 정리가 되면 아직 출차 되지 않은 차량은 23:59 분 기준으로 또 값을 변경해줘야 한다.
이후 들어 있는 시간으로 기본시간을 초과한 경우 기본값 + 추가요금을 내게 하고 기본시간을 초과하지 못한 경우 기본 값만 내게 계산을 해서 배열에 담은 후 반환해주면 된다.
나의 답안
public static int[] solution(int[] fees, String[] records) {
ArrayList<Integer> answer = new ArrayList<>();
LinkedList<String> parking = new LinkedList<>();
Map<String, Integer> cars = new HashMap<>();
for (int i = 0; i < records.length; i++) {
String[] s = records[i].split(" ");
if ("IN".equals((s[2]))) {
String[] time = (s[0]).split(":");
int sum = Integer.parseInt(time[1]) + (Integer.parseInt(time[0]) * 60);
cars.put(s[1], cars.getOrDefault(s[1], 0) - sum);
parking.add(s[1]);
} else {
String[] time = (s[0]).split(":");
int sum = Integer.parseInt(time[1]) + (Integer.parseInt(time[0]) * 60);
cars.put(s[1], sum + cars.get(s[1]));
parking.remove(s[1]);
}
}
for (int i = 0; i < records.length; i++) {
String[] s = records[i].split(" ");
if (parking.contains(s[1])) {
String[] time = "23:59".split(":");
int sum = Integer.parseInt(time[1]) + (Integer.parseInt(time[0]) * 60);
cars.put(s[1], sum + cars.get(s[1]));
parking.remove(s[1]);
}
}
ArrayList<String> list = new ArrayList<>(cars.keySet());
list.sort((s1, s2) -> s1.compareTo(s2));
for (String key : list) {
int time = cars.get(key).intValue();
int cost = 0;
if (time / fees[0] > 0) {
cost = fees[1];
time -= fees[0];
} else if (time < fees[0]) {
cost = fees[1];
time = 0;
}
int ceil = (int) Math.ceil((float)time / fees[2]);
cost += ceil * fees[3];
answer.add(cost);
}
return answer.stream().mapToInt(i -> i).toArray();
}
'Programmers 문제풀이 > Lv.2' 카테고리의 다른 글
주식 가격 (0) | 2023.04.05 |
---|---|
오픈채팅방 (0) | 2023.04.05 |
[3차] n진수 게임 (0) | 2023.04.03 |
할인 행사 (0) | 2023.04.03 |
피로도 (0) | 2023.04.03 |