https://school.programmers.co.kr/learn/courses/30/lessons/92341
HashMap과 Queue를 사용해서 풀었다.
문제에서는 IN, OUT을 제공해서 들어왔는지 나갔는지 정보를 제공해주었는데 나는 그걸 안쓰고 바로 Queue에서 두 개씩 짝지어서 들어가고 나간 것을 계산하고 하나 남았을 때 23:59 OUT임으로 계산하였다.
HashMap에 Queue를 이용하여 차량번호마다 입차시간, 출차시간을 저장한다
저장한 시간을 out - in
으로 분으로 바꿔서 계산한다
시간을 요금으로 계산한다
queue에 저장한 입차시간, 출차시간을 하나의 정수 시간으로 바꿀 때 List를 사용할 까 했지만 queue에 하나의 원소만 갖도록 queue를 재사용했다
HashMap을 List로 뽑고 정렬해서 answer return한다.
// map 에 queue 넣기
for (String record : records) {
String[] split = record.split(" ");
int time = Integer.parseInt(split[0].substring(0, 2)) * 60 + Integer.parseInt(split[0].substring(3, 5));
if (!map.containsKey(split[1])) {
Queue<Integer> queue = new LinkedList<>();
queue.add(time);
map.put(split[1], queue);
} else {
Queue<Integer> queue = map.get(split[1]);
queue.add(time);
map.replace(split[1], queue);
}
}
HashMap에
<key> <value>
차량번호 Queue[ ]
차량번호 Queue[ ]
형태로 저장
// queue 시간 계산
for (Map.Entry<String, Queue<Integer>> stringQueueEntry : map.entrySet()) {
Queue<Integer> queue = stringQueueEntry.getValue();
int time = 0;
double finalFee = 0;
while (queue.size() >= 2) {
int in = queue.poll();
int out = queue.poll();
time += out - in;
}
if (queue.size() == 1) {
int in = queue.poll();
int out = 60 * 23 + 59;
time += out - in;
}
// 주차비 계산
if (time <= baseTime) {
finalFee = baseFee;
} else {
finalFee = baseFee + Math.ceil((time - baseTime) / rateMin) * rateFee;
}
queue.add((int)finalFee);
map.replace(stringQueueEntry.getKey(), queue);
}
queue에 있는 값들을 이용해 주차비 계산
List<String> keyList = new ArrayList<>(map.keySet());
keyList.sort(String::compareTo);
int i=0;
for (String key : keyList) {
answer[i] = map.get(key).poll();
i++;
}
정렬 후 정답 배열 저장
import java.util.*;
class Solution {
HashMap<String, Queue<Integer>> map = new HashMap<>();
public int[] solution(int[] fees, String[] records) {
// 맵에 queue 넣기
for (String record : records) {
String[] split = record.split(" ");
int time = Integer.parseInt(split[0].substring(0, 2)) * 60 + Integer.parseInt(split[0].substring(3, 5));
if (!map.containsKey(split[1])) {
Queue<Integer> queue = new LinkedList<>();
queue.add(time);
map.put(split[1], queue);
} else {
Queue<Integer> queue = map.get(split[1]);
queue.add(time);
map.replace(split[1], queue);
}
}
int[] answer = new int[map.size()];
double baseTime = fees[0];
double baseFee = fees[1];
double rateMin = fees[2];
double rateFee = fees[3];
// queue 시간 계산
for (Map.Entry<String, Queue<Integer>> stringQueueEntry : map.entrySet()) {
Queue<Integer> queue = stringQueueEntry.getValue();
int time = 0;
double finalFee = 0;
while (queue.size() >= 2) {
int in = queue.poll();
int out = queue.poll();
time += out - in;
}
if (queue.size() == 1) {
int in = queue.poll();
int out = 60 * 23 + 59;
time += out - in;
}
// 주차비 계산
if (time <= baseTime) {
finalFee = baseFee;
} else {
finalFee = baseFee + Math.ceil((time - baseTime) / rateMin) * rateFee;
}
queue.add((int)finalFee);
map.replace(stringQueueEntry.getKey(), queue);
}
List<String> keyList = new ArrayList<>(map.keySet());
keyList.sort(String::compareTo);
int i=0;
for (String key : keyList) {
answer[i] = map.get(key).poll();
i++;
}
return answer;
}
}
문제가 길 때는 시각자료(그림, 표)를 먼저 보고 이해하는 게 시간 단축에 좋다.
간단한 구현 문제였지만 Java 문법이 떠오르지않아 자바 문법을 찾아본다고 시간을 허비하였다.
Integer.ceil() 함수로 올림을 할 수 있고
Map은 List로 뽑아서 정렬하면 쉽다.