본문 바로가기

Algorithm

2022 KAKAO 블라인드 채용 - 주차 요금 계산 (Java 풀이)

OUT일 경우에는 같은 차량번호의 IN을 찾아야하는데, 나는 map을 이용해서 IN의 시각을 저장해주었다.
OUT시각과 IN시각을 분 단위로 변경해준후에 map에 해당 차량번호의 주차시간 누적합을 저장해주었다.

요금 계산은 주차시간이 기본 시간보다 못미치는 경우에는 기본요금을, 초과하는 경우에는 문제에 나온대로 계산해서 추가해주었다.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public Integer getMinutes(String time) {
        String[] spt = time.split(":");
        Integer hours = Integer.parseInt(spt[0]);
        Integer minutes = Integer.parseInt(spt[1]);
        return hours * 60 + minutes;
    }

    class ParkingInfo {
        String carNumber;
        Integer fee;

        public Integer getFee() {
            return fee;
        }
    }

    public int[] solution(int[] fees, String[] records) {
        int minimumTime = fees[0];
        int minimumFee = fees[1];
        int timeUnit = fees[2];
        int feeUnit = fees[3];

        Map<String, String> timeRecord = new HashMap<>(); // car number, time
        Map<String, Integer> parkingTimeSum = new HashMap<>(); // car number, timeSum

        for (int i = 0; i < records.length; i++) {
            String[] spt = records[i].split(" ");

            String time = spt[0];
            String carNumber = spt[1];
            String order = spt[2];
            if ("IN".equals(order)) {
                timeRecord.put(carNumber, time);
            } else if ("OUT".equals(order)) {
                Integer inTime = getMinutes(timeRecord.get(carNumber));
                Integer outTime = getMinutes(time);
                Integer timeSum = parkingTimeSum.getOrDefault(carNumber, 0);
                timeSum += (outTime - inTime);
                parkingTimeSum.put(carNumber, timeSum);
                timeRecord.remove(carNumber);
            }
        }
        for (String carNumber : timeRecord.keySet()) {
            Integer inTime = getMinutes(timeRecord.get(carNumber));
            Integer outTime = 23 * 60 + 59;
            Integer timeSum = parkingTimeSum.getOrDefault(carNumber, 0);
            timeSum += (outTime - inTime);
            parkingTimeSum.put(carNumber, timeSum);
        }
        List<ParkingInfo> parkingFees = new ArrayList<>();
        for (String carNumber : parkingTimeSum.keySet()) {
            ParkingInfo parkingInfo = new ParkingInfo();
            parkingInfo.carNumber = carNumber;
            Integer parkingTime = parkingTimeSum.get(carNumber);
            Integer fee = 0;
            if (parkingTime <= minimumTime) {
                fee = minimumFee;
            } else {
                fee = minimumFee + (int) Math.ceil((parkingTime - minimumTime) / ((double) timeUnit)) * feeUnit;
            }
            parkingInfo.fee = fee;
            parkingFees.add(parkingInfo);
        }
        return parkingFees.stream()
                .sorted((a, b) -> a.carNumber.compareTo(b.carNumber))
                .mapToInt(ParkingInfo::getFee).toArray();
    }
}

프로그래머스 링크

https://programmers.co.kr/learn/courses/30/lessons/92341

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

반응형

'Algorithm' 카테고리의 다른 글

신고 결과 받기 - 2022 Kakao Blind Recruitment  (0) 2022.07.09