92341
코딩테스트 연습 - 주차 요금 계산 | 프로그래머스 스쿨 (programmers.co.kr)
풀이
📌주차요금 계산식
주차 요금 = 기본 요금 + [(주차 누적시간 - 기본시간) / 단위 시간] * 단위 요금
📌주차 누적시간
모든 주차 시간을 분단위로 변환하면 계산하기 편합니다.
예를 들어 입차시간이 02:30 이면 (2*60) + 30 = 150
그리고 출차시간이 03:30 이면 (3*60) + 30 = 210
그러므로 주차 누적시간은 210(출차)-150(입차) = 60(분)
📌입차 후 출차기록이 없는 경우
입차 후 출차기록이 없는 경우는 23:59 로 가정한다고 합니다.
23:59 를 분단위로 변환하면 (23*60) + 59 = 1439(분) 입니다.
📝코드
import java.util.Map;
import java.util.TreeMap;
class Solution {
public int[] solution(int[] fees, String[] records) {
Map<String, Integer> map = new TreeMap<>();
for (String record : records) {
String[] split_record = record.split(" ");
String[] split_time = split_record[0].split(":");
int time = (split_record[2].equals("IN") ? -1 : 1) * ((Integer.parseInt(split_time[0]) * 60) + Integer.parseInt(split_time[1]));
String carNumber = split_record[1];
map.put(carNumber, map.getOrDefault(carNumber, 0) + time);
}
int i = 0, lastTime = 1439;
int[] answer = new int[map.size()];
for (String key : map.keySet()) {
int time = map.get(key);
time = time <= 0 ? time + lastTime : time;
double baseTime = time-fees[0] < 0 ? 0 : time-fees[0];
int price = fees[1] + (int) Math.ceil(baseTime / fees[2]) * fees[3];
answer[i++] = price;
}
return answer;
}
}
🎈차량 별 주차요금 계산할 변수 map
map에 저장될 정보 : [차량번호, 누적 주차시간(분)]
🎈주차시간 계산
int time = (split_record[2].equals("IN") ? -1 : 1) * ((Integer.parseInt(split_time[0]) * 60) + Integer.parseInt(split_time[1]));
누적 주차시간을 계산하기 위해서 입차인 경우에는 마이너스, 출차인 경우 플러스로 주차시간을 계산합니다.
🎈누적 주차시간 계산
map.put(carNumber, map.getOrDefault(carNumber, 0) + time);
🔨 default V getOrDefault(Object key, V defaultValue)
map 내에 key가 있으면 해당 key의 value를 반환하고, key가 없으면 내가 지정한 defaultValue를 반환합니다.
🎈예시
차량번호 | 시각(시:분) => 시간(분) | 입차/출차 | 합산할 누적 시간 => [ map ] |
0000 | 01:30 => 90 | 입차 | -90 => [ "0000", -90 ] |
0000 | 02:30 => 150 | 출차 | +150 => [ "0000", 60 ] |
0000 | 02:40 => 160 | 입차 | -160 => [ "0000", -100 ] |
이렇게 map에 각 차량번호와 누적시간을 계산해 저장합니다.
🎈출차기록이 없는 경우
int time = map.get(key);
time = time <= 0 ? time + lastTime : time;
조건에 입차 이후 반드시 출차가 이루어져야 합니다.
만약 입차 이후 출차가 이루어지지 않았다면 누적시간은 음수일 것입니다.
그러나 입차가 00:00이면 누적시간은 0인데 이 때에도 출차가 없을 수도 있으므로 time <= 0 으로 조건을 주었습니다.
해당 조건일 경우에는 자동으로 마지막 출차(23:59)를 누적시간에 더합니다.
🎈누적 주차시간이 기본 시간보다 작으면 추가로 낼 요금이 없으므로 0원 처리합니다.
double baseTime = time-fees[0] < 0 ? 0 : time-fees[0];
⚡정확성 테스트
테스트 1 〉 | 통과 (0.76ms, 73.2MB) |
테스트 2 〉 | 통과 (0.68ms, 73.6MB) |
테스트 3 〉 | 통과 (0.92ms, 72.3MB) |
테스트 4 〉 | 통과 (1.72ms, 77MB) |
테스트 5 〉 | 통과 (2.13ms, 73MB) |
테스트 6 〉 | 통과 (2.14ms, 80.2MB) |
테스트 7 〉 | 통과 (7.01ms, 79.3MB) |
테스트 8 〉 | 통과 (5.04ms, 90.6MB) |
테스트 9 〉 | 통과 (2.14ms, 78.4MB) |
테스트 10 〉 | 통과 (7.27ms, 77.8MB) |
테스트 11 〉 | 통과 (7.02ms, 82.9MB) |
테스트 12 〉 | 통과 (6.85ms, 78.1MB) |
테스트 13 〉 | 통과 (0.78ms, 73.1MB) |
테스트 14 〉 | 통과 (0.68ms, 77.1MB) |
테스트 15 〉 | 통과 (0.57ms, 75.1MB) |
테스트 16 〉 | 통과 (0.59ms, 76.9MB) |
'Algorithm > Java' 카테고리의 다른 글
프로그래머스 - 줄 서는 방법 JAVA :: 12936 (1) | 2022.08.13 |
---|---|
프로그래머스 - 숫자의 표현 JAVA (0) | 2022.08.05 |
프로그래머스 - 최댓값과 최솟값 JAVA (0) | 2022.08.01 |
프로그래머스 - 최솟값 만들기 JAVA :: 12941 (0) | 2022.08.01 |
프로그래머스 - 양궁대회 JAVA :: 2022 KAKAO BLIND RECRUITMENT :: 92342 (0) | 2022.07.27 |