728x90
728x90
문제링크
https://programmers.co.kr/learn/courses/30/lessons/92341
문제풀이
👨🏻💻 핵심 스킬 👨🏻💻
구현, Map
주차요금계산 문제는 입력으로 들어오는 주차에 대한 record정보로 하루동안 차량의 출입 여부로 시간을 계산하여 그 날동안 총 주차한 시간으로 요금을 계산해주는 문제이다.
이 문제는 records의 크기만큼 시간이 걸릴 것이고, 크기가 최대 1000이기 때문에 구현을 할 때 큰 제약이 없었다.
주차 시간에 영향을 미치는 경우는 주차 후 출차를 할때와 입차 후 출차에 기록이 없어 23:59로 처리할 때 이렇게 두가지 경우이다. 따라서, 나는 records 배열을 모두 확인하여 입차 시 차량의 번호를 키값으로 입차시간을 value값으로 하여 시간을 기록해두었고, 출차 시 해당 값을 꺼내어 시간을 계산해주고 키값으로 차량의 번호 value값으로 누적 시간을 넣어주었다. 그리고 출차를 한 경우 입차에 대한 기록을 삭제해주어 record를 돌고 남은 입차차량의 정보를 23:59에 출차한 차량으로 계산해서 추가해주었다.
시간을 모두 구했다면 Arrays.sort()를 활용해 key값을 정렬해주고, 주차요금에 대한 정보를 참고하여 주차비용을 계산하여 answer에 넣어주어 문제를 해결하였다.
구현코드
package pgm_92341;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int[] solution(int[] fees, String[] records) {
int[] answer;
Map<String, String> inTime = new HashMap<>();
Map<String, Integer> accumulationTime = new HashMap<>();
for(String record : records){
String[] recordSplit = record.split(" ");
String time = recordSplit[0];
String carNumber = recordSplit[1];
if(recordSplit[2].equals("IN")){
inTime.put(carNumber,time);
}
else{
String parkingInTime = inTime.get(carNumber);
int pastTime = 0;
if(accumulationTime.containsKey(carNumber)){
pastTime += accumulationTime.get(carNumber);
}
accumulationTime.put(carNumber,calcParkingTime(parkingInTime, time) + pastTime);
inTime.remove(carNumber);
}
}
for(String carNumber : inTime.keySet()){
int pastTime = 0;
String parkingInTime = inTime.get(carNumber);
if(accumulationTime.containsKey(carNumber)){
pastTime += accumulationTime.get(carNumber);
}
accumulationTime.put(carNumber,calcParkingTime(parkingInTime, "23:59") + pastTime);
}
String[] carNumbers = accumulationTime.keySet().toArray(new String[0]);
Arrays.sort(carNumbers);
answer = new int[carNumbers.length];
for(int i = 0; i < answer.length; i++){
answer[i] = settlementFee(accumulationTime.get(carNumbers[i]),fees);
}
return answer;
}
public int settlementFee(int accumulationTime, int[] fees){
if(accumulationTime <= fees[0])
return fees[1];
accumulationTime -= fees[0];
return fees[1]+(((accumulationTime % fees[2] == 0 ? 0 : 1) + (accumulationTime / fees[2]))*fees[3]);
}
public int calcParkingTime(String parkingInTime, String parkingOutTime){
String[] splitInTime = parkingInTime.split(":");
String[] splitOutTime = parkingOutTime.split(":");
return (Integer.parseInt(splitOutTime[0])*60 + Integer.parseInt(splitOutTime[1])) - (Integer.parseInt(splitInTime[0])*60 + Integer.parseInt(splitInTime[1]));
}
}
시간복잡도
Records를 모두 확인해 계산하기 때문에 Records의 길이만큼의 시간이 걸리게 된다.
잘못된 지식이나 궁금한 내용이 있을 경우 편하게 댓글 남겨주시면 감사하겠습니다 :)
728x90
728x90
'CodingTest > Programmers' 카테고리의 다른 글
[카카오] 양궁대회 (java) (0) | 2022.01.22 |
---|---|
[카카오] k진수에서 소수 개수 구하기 (java) (0) | 2022.01.22 |
[카카오] 단체사진찍기 (java) (0) | 2022.01.16 |
[카카오] 오픈채팅방 (java) (0) | 2022.01.15 |
[카카오] 신고 결과 받기 (java) (0) | 2022.01.15 |