코딩 테스트/프로그래머스
[프로그래머스] 주차 요금 계산
sangjin98
2024. 3. 7. 21:23
반응형
문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 분석
문제를 읽어보면 특별한 알고리즘 없이 조건대로 구현하는 문제이다.
제한사항을 살펴보고 주의할 점이 있는지 알아보자.
records 의 길이는 1000 이하이고 최대로 기본 요금은 100,000에 단위 요금은 10,000 이다.
혹시 요금이 int 값을 넘는지 확인해 보자면 최대 기본 요금 + 최대 단위 요금 * 24 * 60 로 int 값으로 표현 가능하다.
문제 접근
그냥 문제에서 요구하는 것을 하나하나 구현해 나가면 된다.
Map 자료구조에 <차량 번호, [ 시각 , 누적 주차 시간]> 을 저장하였다.
record 를 보고
입차이면 <차량 번호, [ 입차 시각, 0]> 을 map 에 넣어주고
출차이면 차량 번호로 map 으로 부터 [입차 시각, 누적 주차 시간] 을 가져와 주차 시간을 계산하고
[-1, 누적 주차 시간] 으로 업데이트 했다.
-1 은 해당 차량이 출차하여 주차되어 있지 않다는 것을 뜻한다.
마지막으로 map 내용을 기반으로 요금을 계산하는데,
만약 시각 부분이 -1이 아닌 경우에는 출차 시간을 23:59 으로 하여 누적 주차 시간을 다시 계산해주고 요금을 계산해야 한다.
코드
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public int[] solution(int[] fees, String[] records) {
int basicMinute = fees[0];
int basicFee = fees[1];
int unitMinute = fees[2];
int unitFee = fees[3];
// < 차량번호, [시각, 누적 주차 시간] >
Map<String, int[]> recordMap = new HashMap<>();
for(String record : records){
String[] recordSplit = record.split(" ");
String time = recordSplit[0];
String carNum = recordSplit[1];
String act = recordSplit[2];
if(act.equals("IN")) {
recordMap.putIfAbsent(carNum, new int[2]);
recordMap.get(carNum)[0] = changeMinute(time);
}else{
int enterMinute = recordMap.get(carNum)[0];
int exitMinute = changeMinute(time);
recordMap.get(carNum)[0] = -1;
recordMap.get(carNum)[1] += exitMinute - enterMinute;
}
}
List<Integer> feeList = new ArrayList<>();
List<String> sortedCarNumber = recordMap.keySet().stream()
.sorted()
.collect(Collectors.toList());
for (String carNumber : sortedCarNumber) {
if (recordMap.get(carNumber)[0] != -1) {
int enterMinute = recordMap.get(carNumber)[0];
int exitMinute = changeMinute("23:59");
recordMap.get(carNumber)[1] += exitMinute - enterMinute;
}
feeList.add(calculateTotalFee(recordMap.get(carNumber)[1], basicMinute, basicFee, unitMinute, unitFee));
}
return feeList.stream().mapToInt(Integer::intValue).toArray();
}
public static int changeMinute(String time){
int h = Integer.parseInt(time.split(":")[0]);
int m = Integer.parseInt(time.split(":")[1]);
return h * 60 + m;
}
public static int calculateTotalFee(int totalMinute, int basicMinute, int basicFee, int unitMinute, int unitFee) {
if (totalMinute <= basicMinute) {
return basicFee;
}
return basicFee + (int)Math.ceil((totalMinute - basicMinute + 0.0) / unitMinute) * unitFee;
}
}
반응형