코딩 테스트/프로그래머스

[프로그래머스] 주차 요금 계산

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;
    }
    
}

 

반응형