728x90
코드 힌트
- 기록 관리:
- 각 차량의 입차 및 출차 시간을 관리하여, 차량이 얼마나 오랫동안 주차했는지를 계산합니다.
- 출차 기록이 없는 차량은 마지막 시간인 23:59에 자동으로 출차 처리됩니다.
- 요금 계산:
- 차량이 기본 시간 이하로 주차한 경우, 기본 요금만 부과됩니다.
- 기본 시간을 초과한 경우, 추가 시간에 대해 단위 요금을 적용하여 최종 요금을 계산합니다.
- 추가 시간 계산 시, (현재 시간 - 주차 시간 - 기본 주차 시간) / 추가 시간 단위가 소수점으로 나누어떨어지지 않으면 올림 처리를 해야 합니다.
- 입출차 처리:
- 차량이 입차할 때는 해당 차량의 입차 시간을 기록합니다.
- 차량이 출차할 때는 현재 시간과 입차 시간의 차이를 이용해 총 주차 시간을 계산하고 기록합니다.
- 출차가 완료된 후, 차량의 입차 기록은 삭제됩니다.
- 최종 결과:
- 모든 차량의 주차 시간이 계산된 후, 차량 번호를 오름차순으로 정렬합니다.
- 각 차량의 주차 요금을 계산하여 최종 결과로 반환합니다.
정답은 더보기 클릭
더보기
import java.util.*;
class Solution {
static HashMap<String, Integer> parkingInTime; // 차량이 입차된 시간을 기록하는 맵
static HashMap<String, Integer> parkingTotalTime; // 차량의 총 주차 시간을 기록하는 맵
static Set<String> vehicleSet; // 차량 번호 중복 체크를 위한 세트
public int[] solution(int[] fees, String[] records) {
parkingInTime = new HashMap<>();
parkingTotalTime = new HashMap<>();
vehicleSet = new HashSet<>();
// 모든 기록을 순차적으로 처리
for (String record : records) {
String[] infoArr = record.split(" ");
String[] curTime = infoArr[0].split(":");
String number = infoArr[1];
boolean isEnter = infoArr[2].equals("IN");
int curMinutes = Integer.parseInt(curTime[0]) * 60 + Integer.parseInt(curTime[1]);
if (isEnter) {
carIn(number, curMinutes);
} else {
carOut(number, curMinutes);
}
}
// 출차 기록이 없는 차량을 23:59에 출차 처리
List<String> vehicleList = new ArrayList<>(vehicleSet);
for (String number : vehicleList) {
carOut(number, 1439); // 23:59에 출차
}
// 차량 번호를 오름차순으로 정렬
Collections.sort(vehicleList);
int[] result = new int[vehicleList.size()];
// 각 차량의 총 주차 시간을 바탕으로 요금 계산
for (int i = 0; i < vehicleList.size(); i++) {
String number = vehicleList.get(i);
result[i] = calculateFare(fees, parkingTotalTime.get(number));
}
return result;
}
// 요금 계산 메소드
public static int calculateFare(int[] fees, int time) {
int baseTime = fees[0];
int baseFare = fees[1];
int unitTime = fees[2];
int unitFare = fees[3];
if (time <= baseTime) {
return baseFare;
}
int extraTime = time - baseTime;
int additionalFare = (int) Math.ceil((double) extraTime / unitTime) * unitFare;
return baseFare + additionalFare;
}
// 입차 처리 메소드
public static void carIn(String number, int curMinutes) {
parkingInTime.put(number, curMinutes);
vehicleSet.add(number);
}
// 출차 처리 메소드
public static void carOut(String number, int curMinutes) {
if (parkingInTime.containsKey(number)) {
int inTime = parkingInTime.get(number);
parkingInTime.remove(number);
parkingTotalTime.put(number, parkingTotalTime.getOrDefault(number, 0) + curMinutes - inTime);
}
}
}
728x90
'프로그래머스(Java) > Level 2' 카테고리의 다른 글
[프로그래머스] 오픈채팅방 (0) | 2024.08.23 |
---|---|
[프로그래머스] 택배상자 (0) | 2024.08.23 |
[프로그래머스] 스킬트리 (0) | 2024.08.21 |
[프로그래머스] 땅따먹기 (0) | 2024.08.20 |
[프로그래머스] 방문 길이 (0) | 2024.08.20 |