문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/92341
제한 사항
입출력 예
풀이
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
class Solution {
public int[] solution(int[] fees, String[] records) {
ArrayList<Integer> answer = new ArrayList<>();
HashMap<String, int[]> recordMap = new HashMap<>();
HashMap<Integer, Integer> result = new HashMap<>();
final int endOfDay = 23 * 60 + 59;
for (int i = 0; i < records.length; i++) {
String[] car = records[i].split(" ");
String[] timeStr = car[0].split(":");
int time = Integer.parseInt(timeStr[0]) * 60 + Integer.parseInt(timeStr[1]);
if (recordMap.containsKey(car[1])) { // 출차
time -= recordMap.get(car[1])[0];
result.put(Integer.valueOf(car[1]), result.getOrDefault(Integer.valueOf(car[1]), 0) + time);
recordMap.remove(car[1]);
}
else { // 입차
recordMap.put(car[1], new int[] { time });
}
}
for (Map.Entry<String, int[]> remainCar : recordMap.entrySet()) // 마지막까지 나가지 않은 차 처리
result.put(Integer.valueOf(remainCar.getKey())
, result.getOrDefault(Integer.valueOf(remainCar.getKey()), 0) + endOfDay - remainCar.getValue()[0]);
for (Map.Entry<Integer, Integer> car : result.entrySet()) { // 주차 요금 계산
int fee = fees[1];
if (car.getValue() > fees[0]) {
fee += (car.getValue() - fees[0]) / fees[2] * fees[3];
if ((car.getValue() - fees[0]) % fees[2] != 0) fee += fees[3];
}
result.put(Integer.valueOf(car.getKey()), fee);
answer.add(Integer.valueOf(car.getKey()));
}
return answer.stream().sorted().mapToInt(i -> result.get(i)).toArray();
}
}
후기
이 문제는 문제 자체는 이해하기 쉽지만 구현을 하는 것이 문제이다. 나는 출차할 때 시간을 계산하여 결과 맵에 더해주었고 나중에 이 총 주차 시간 맵을 가지고 키를 기준으로 정렬하여 풀었다. In과 Out은 필요가 없었는데, 그 이유는 어차피 차는 들어 갔다 나오게 되어있고, 나오지 않는다 하더라고 23 * 60 + 59에서 빼주면 되므로 사용할 필요가 없는 것이다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
[프로그래머스][JAVA][Lv. 2] 게임 맵 최단거리 (0) | 2023.09.26 |
---|---|
[프로그래머스][JAVA][Lv. 2] 더 맵게 (0) | 2023.09.25 |
[프로그래머스][JAVA][Lv. 2] n진수 게임 (0) | 2023.09.23 |
[프로그래머스][JAVA][Lv. 2] 압축 (0) | 2023.09.22 |
[프로그래머스][JAVA][Lv. 2] k진수에서 소수 개수 구하기 (0) | 2023.09.20 |