주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
기본 시간(분) | 기본 요금(원) | 단위 시간(분) |
---|---|---|
180 | 5000 | 10 |
시각(시:분) | 차량 번호 | 내역 |
---|---|---|
05:34 | 5961 | 입차 |
06:00 | 0000 | 입차 |
06:34 | 0000 | 출차 |
07:59 | 5961 | 출차 |
07:59 | 0148 | 입차 |
18:59 | 0000 | 입차 |
19:09 | 0148 | 출차 |
22:59 | 5961 | 입차 |
23:00 | 5961 | 출차 |
차량 번호 | 누적 주차 시간(분) | 주차 요금(원) |
---|---|---|
0000 | 34 + 300 = 334 | 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600 |
0148 | 670 | 5000 +⌈(670 - 180) / 10⌉x 600 = 34400 |
5961 | 145 + 1 = 146 | 5000 |
- 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
- 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
- 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
- 누적 주차 시간이
기본 시간
이하라면,기본 요금
을 청구합니다.- 누적 주차 시간이
기본 시간
을 초과하면,기본 요금
에 더해서, 초과한 시간에 대해서단위 시간
마다단위 요금
을 청구합니다.
- 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
⌈a⌉
: a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림을 의미합니다.
주차 요금을 나타내는 정수 배열
fees
, 자동차의 입/출차 내역을 나타내는 문자열 배열records
가 매개 변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
- fees의 길이 = 4
- fees[0] =
기본 시간(분)
- 1 ≤ fees[0] ≤ 1,439
- fees[1] =
기본 요금(원)
- 0 ≤ fees[1] ≤ 100,000
- fees[2] =
단위 시간(분)
- 1 ≤ fees[2] ≤ 1,439
- fees[3] =
단위 요금(원)
- 1 ≤ fees[3] ≤ 10,000
- 1 ≤
records
의 길이 ≤ 1,000
records
의 각 원소는 "시각 차량번호 내역" 형식의 문자열입니다.시각
,차량번호
,내역
은 하나의 공백으로 구분되어 있습니다.시각
은 차량이 입차되거나 출차된 시각을 나타내며, HH:MM 형식의 길이 5인 문자열입니다.
HH:MM
은 00:00부터 23:59까지 주어집니다.- 잘못된 시각("25:22", "09:65" 등)은 입력으로 주어지지 않습니다.
차량번호
는 자동차를 구분하기 위한, `0'~'9'로 구성된 길이 4인 문자열입니다.내역
은 길이 2 또는 3인 문자열로,IN
또는OUT
입니다.IN
은 입차를,OUT
은 출차를 의미합니다.records
의 원소들은 시각을 기준으로 오름차순으로 정렬되어 주어집니다.records
는 하루 동안의 입/출차된 기록만 담고 있으며, 입차된 차량이 다음날 출차되는 경우는 입력으로 주어지지 않습니다.
같은 시각에, 같은 차량번호의 내역이 2번 이상 나타내지 않습니다.- 마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지 않습니다.
- 아래의 예를 포함하여, 잘못된 입력은 주어지지 않습니다.
- 주차장에 없는 차량이 출차되는 경우
- 주차장에 이미 있는 차량(차량번호가 같은 차량)이 다시 입차되는 경우
fees | records | result |
---|---|---|
[180, 5000, 10, 600] | ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] | [14600, 34400, 5000] |
[120, 0, 60, 591] | ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] | [0, 591] |
[1, 461, 1, 10] | ["00:00 1234 IN"] | [14841] |
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
int [] answer;
TreeMap <String, Integer> info = new TreeMap<>();
for(int i = 0; i < records.length; i++){
String [] words = records[i].split("\\s");
if(words[2].equals("IN")) {
int in = (Integer.parseInt(words[0].substring(0,2)) * 60
+ Integer.parseInt(words[0].substring(3))) * -1;
if(!info.containsKey(words[1]))
info.put(words[1], in);
else info.put(words[1], info.get(words[1]) + in);
}
if(words[2].equals("OUT")){
for(String s : info.keySet()){
if(words[1].equals(s)){
int out = (Integer.parseInt(words[0].substring(0,2)) * 60
+ Integer.parseInt(words[0].substring(3)));
info.replace(s, info.get(s) + out);
}
}
}
}
answer = new int[info.size()];
int index = -1;
for(String s : info.keySet()) {
int num = 0;
if (info.get(s) <= 0)
info.replace(s, info.get(s) + 1439);
num += fees[1];
if(info.get(s) < fees[0]) {
answer[++index] = num;
continue;
}
num += (int)Math.ceil((info.get(s) - fees[0])/Double.parseDouble(String.valueOf(fees[2]))) * fees[3];
answer[++index] = num;
}
return answer;
}
}
💡 제한 사항에 차량 번호가 작은 순서부터 배열에 담아야 한다는 조건이 있기 때문에 HashMap 대신 자동으로 키 값에 따라 정렬을 해 주는 TreeMap을 사용하게 되었다 (TreeMap을 이용해 문제를 푼 건 처음인데 편리한 것 같았다)
key
를 차량 번호로 두고,value
를 총 주차한 시간으로 설정되게 하였다
💡 입출차 내역이 담긴 배열
records
에서 원소마다 공백으로 나누어words
배열에 담아 주게 된다 맨 마지막 인덱스에 내역이 들어가게 되는데 만약IN
이라면 00:00을 기준으로 입차를 한 시간 만큼 분 단위로 바꾸어 음수로 취해 준 후 변수in
에 넣어 주고 해당 차량 번호에 대한 트리맵이 있다면 해당value
에서in
만큼 더해 주고, 해당 차량 번호에 대한 트리맵이 없다면in
을value
로 설정해 준다 / 만약 마지막 인덱스가OUT
이라면 출차한 것임을 뜻하므로 00:00을 기준으로 출차를 한 시간만큼 분 단위로 바꾸어 변수out
에 넣어 주고 해당 차량 번호에 대한value
값을 현재value
에서out
을 더해 준 값으로 바꾸어 준다
💡
answer
배열에 최종 주차값을 넣기 위해 반복문을 돌리게 되는데,value
값이 0 이하라는 것은 입차만 하고 출차를 한 적이 없다는 뜻이므로 출차 시간을 23:59로 맞춰 주기 위해 23:59를 분으로 환산한 1439를 해당 차량 번호value
값에 더해 주게 된다 이후 모든 차량에 기본 요금을 더해 주는데누적 시간(value)
이기본 시간
보다 적다면기본 요금
만 내면 되므로 answer에 기본 요금만 대입해 주고, continue로 해당 반복을 바로 끝내 주었다 하지만누적 시간
이기본 시간
보다 더 크다면누적 시간
에서기본 시간
을 뺀 시간을단위 시간
으로 나눈 후단위 요금
을 곱한 금액을 아까 더했던기본 요금
에 추가로 더해 주면 된다 이렇게 총 정리된 금액을 answer 배열에 넣어 주면 된다 만약 ((누적 시간
-기본 시간
) /단위 시간
) 한 것이 딱 정수로 나누어 떨어지지 않는다면 Math.ceil을 통해 소수점 올림을 하게 해 주었다