소요시간
총 소요시간은 53분 .
문제 이해하는 데에 10분
(다 읽기에는 문제가 진짜 너무 길었다. 대략적으로 훑어보고 우선 코딩한 후 제출하여서 나중에 실패가 뜨면 그 떄 찾아보기로 함.. 다행히 내가 생각한 것 외에는 오류 안났음 !)
어떤 알고리즘 쓸까 생각하고 시간복잡도 계산하는데에 5분
나머지 시간은 구현하는데에 사용.
이번 문제는 예외 처리해줄게 IN 으로 들어갔는데 OUT으로 나오지 않았다면 그 차는 23:59에 나온 것으로 간주한다는 것이다.
문제 해결 과정
가장 크게 고민한 문제 : 시간을 어떻게 더해주고 빼주냐는 것이다. 예를 들어 08:40 - 06:20 이라고 하면 시간 따로, 분 따로 빼줘서 02:20이 나온다. 하지만 08:40 - 05:50 이라면?? 이 경우에 어떻게 빼줘야 할지 많이 고민했다. 그리고 내린 결론은 시간에 60을 곱해줘서 분으로 환산한 후 계산하는 것이다.
소스코드
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
HashMap<Integer,Integer> map=new HashMap<>();
HashMap<Integer,Integer> cost=new HashMap<>();
for(int i=0;i<records.length;i++){
String line[]=records[i].split(" ");
String time[]=line[0].split(":");
int carNum=Integer.parseInt(line[1]);
int hour=Integer.parseInt(time[0]);
int minute=Integer.parseInt(time[1]);
minute+=(hour*60);
if(map.containsKey(carNum)==false)
map.put(carNum,minute);
else{
Integer prevMinute=map.remove(carNum);
int price=minute-prevMinute;
if(cost.containsKey(carNum)==false)
cost.put(carNum,price);
else
cost.replace(carNum,cost.get(carNum)+price);
}
}
for(int carNum:map.keySet()){
int prevPrice=map.get(carNum);
int nowPrice=1439;
int price=nowPrice-prevPrice;
if(cost.containsKey(carNum)==false)
cost.put(carNum,price);
else
cost.replace(carNum,cost.get(carNum)+price);
}
int arr[][]=new int[cost.size()][2];
int index=0;
for(int i:cost.keySet()){
arr[index][0]=i;
arr[index][1]=cost.get(i);
index++;
}
Arrays.sort(arr,new Comparator<>(){
@Override
public int compare(int n1[],int n2[]){
if(n1[0]>n2[0])
return 1;
return -1;
}
});
int result[]=new int[arr.length];
for(int i=0;i<arr.length;i++){
result[i]=fees[1];
int overTime=arr[i][1]-fees[0];
if(overTime>0){
System.out.print(overTime+" ");
int cul=overTime%fees[2];
int m=overTime/fees[2];
if(cul!=0) m++;
result[i]+=(m*fees[3]);
}
}
return result;
}
}
회고
시간의 덧셈, 뺄셈 부분에서 좀 약한 것 같다. 나머지(%) 연산을 이용해서 시간의 덧셈 뺄셈을 하는 방법을 알아두어야 겠다. 53분이 걸렸는데 시간을 더 줄일수 있도록 해봐야 겠다.
https://solved.ac/profile/anwlro0212
하루에 백준 1문제 이상 풀기.