728x90
반응형
2022.12.24
코테 문제풀이 23주차 04번 문제
문제
접근방법
문제 그대로 풂
풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
class Solution {
/*
* Date: 2022-12-29
* Time: 20:07
*/
public int[] solution(int[] fees, String[] records) {
return calcParkingFees(fees, records);
}
/**
* 주차 요금 계산
* @param fees 주차 요금을 나타내는 정수 배열
* @param records 자동차의 입/출차 내역을 나타내는 문자열 배열
* @return 차량 번호가 작은 자동차부터 청구할 주차 요금을 나타내는 정수 배열
*/
public int[] calcParkingFees(int[] fees, String[] records) {
/*
* @Desc
* 1.records를 String.split()로 자른 후, 첫번째 인덱스에 들어있는 시간을 시간과 분으로 자른다.
* 2.입출을 기록하는 recordMap과 누적주차시간을 기록하는 calcMap을 선언 및 초기화한다.
* 3.입차와 출차의 건 수가 같으면 recordMap.차량번호의 값을 null로 초기화하고 calcMap에 누적주차시간을 누적한다.
* 4.출차 기록이 없는 건들은 23:59분을 출차시간으로 기록해 계산한다.
* 5.Compartor.compare() 메소드를 오버라이딩해서 차량번호를 기준으로 오름차순 정렬한다.
* 6.요금표를 기준으로 주차요금을 계산한다.
*/
Map<String, Long> calcMap = new HashMap<>();
Map<String, Long> recordMap = new HashMap<>();
for (String record: records) {
String[] oneRowSplit = record.split(" ");
String[] timeSplit = oneRowSplit[0].split(":");
long time = Long.parseLong(timeSplit[0]) * 60 + Long.parseLong(timeSplit[1]);
if (recordMap.get(oneRowSplit[1]) == null)
recordMap.put(oneRowSplit[1], time);
else {
time -= recordMap.get(oneRowSplit[1]);
if (calcMap.get(oneRowSplit[1]) == null)
calcMap.put(oneRowSplit[1], time);
else
calcMap.put(oneRowSplit[1], calcMap.get(oneRowSplit[1]) + time);
recordMap.put(oneRowSplit[1], null);
}
}
recordMap.forEach((key, value) -> {
if (value != null) {
long endTime = 60*23 +59;
long time = endTime - value;
if (calcMap.get(key) == null)
calcMap.put(key, time);
else
calcMap.put(key, calcMap.get(key) + time);
}
});
List<Entry<String, Long>> entryList = new LinkedList<>(calcMap.entrySet());
entryList.sort(new Comparator<Map.Entry<String, Long>>() {
@Override
public int compare(Entry<String, Long> o1, Entry<String, Long> o2) {
return Integer.parseInt(o1.getKey()) - Integer.parseInt(o2.getKey());
}
});
// Output Instance
int[] output = new int[calcMap.size()];
int index = 0;
int baseTime = fees[0];
int baseRate = fees[1];
int unitTime = fees[2];
int unitRate = fees[3];
for (Map.Entry<String, Long> entry: entryList) {
long parkingFee = 0;
parkingFee = entry.getValue() - baseTime > 0 ? entry.getValue() - baseTime : 0;
parkingFee = parkingFee%unitTime==0 ? parkingFee/unitTime : (parkingFee/unitTime) +1;
parkingFee *= unitRate;
parkingFee += baseRate;
output[index++] = (int)parkingFee;
}
return output;
}
}
|
cs |
결과
728x90
반응형
'코딩테스트' 카테고리의 다른 글
[코테/JAVA] 2023 KAKAO BLIND RECRUITMENT : 개인정보 수집 유효기간 (0) | 2023.01.30 |
---|---|
[코테/JAVA] 스택/큐 : 올바른 괄호 (2) | 2023.01.05 |
[코테/JAVA] 월간 코드 챌린지 시즌2 : 2개 이하로 다른 비트 (0) | 2022.12.24 |
[코테/JAVA] 월간 코드 챌린지 시즌1 : 이진 변환 반복하기 (0) | 2022.12.24 |
[코테/JAVA] 연습문제 : 최댓값과 최솟값 (0) | 2022.12.19 |
댓글