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

너구리로소이다·2023년 3월 31일
0

programmers-java-lv2

목록 보기
35/55
post-thumbnail

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

문제 설명

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다.

아래는 하나의 예시를 나타냅니다.

  • 요금표

    기본 시간(분)기본 요금(원)단위 시간(분)단위 요금(원)
    180500010600
  • 입/출차 기록

    시각(시:분)차량 번호내역
    05:345961입차
    06:000000입차
    06:340000출차
    07:595961출차
    07:590148입차
    18:590000입차
    19:090148출차
    22:595961입차
    23:005961출차
  • 자동차별 주차 요금

    차량 번호누적 주차 시간(분)주차 요금(원)
    000034 + 300 = 3345000 + ⌈(334 - 180) / 10⌉ x 600 = 14600
    01486705000 +⌈(670 - 180) / 10⌉x 600 = 34400
    5961145 + 1 = 1465000

✔️ 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.

✔️ 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.

✔️ 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.

✔️ 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
✔️ 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 
   초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.  

✔️ 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
⌈a⌉ : a보다 작지 않은 최소의 정수를 의미합니다. (즉, 올림을 의미합니다.)

주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다.
차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

풀이

결과

import java.util.*;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        int[] answer = {};
        //fees
        //0: 기본시간, 1: 기본요금, 2: 단위시간, 3:단위요금
        int defTime = fees[0];
        int defFee = fees[1];
        int perTime = fees[2];
        int perFee = fees[3];
        
        Map<String,Integer> parking = new HashMap<>();
        Map<String,Integer> cars = new HashMap<>();
        
        for(String record : records){
            String[] info = record.split(" ");
            //info
            String[] trr = info[0].split(":");
            int time = Integer.parseInt(trr[0])*60+Integer.parseInt(trr[1]);
            String carNum = info[1];
            String IO = info[2];
            
            //0: 시간, 1: 차번호, 2: 입/출차
            if(IO.equals("IN")){ //입차                       
                parking.put(carNum,time);
            }else{ //출차        
                int dur = time - parking.get(carNum);  //사용한 시간.
                cars.put(carNum, cars.getOrDefault(carNum,0)+dur);
                parking.remove(carNum);
            }
        }
        
        if(!parking.isEmpty()){
            for(Map.Entry<String,Integer> e : parking.entrySet()){
                int dur = 23*60+59 - e.getValue();
                cars.put(e.getKey(), cars.getOrDefault(e.getKey(),0)+dur);
            }
        }
        
        answer = new int[cars.size()];
        int a = 0;
        
        List<String> klist = new ArrayList<>(cars.keySet());
        Collections.sort(klist);
        
        for(String c : klist){
           int fee = defFee;
           if(cars.get(c)-defTime > 0){
               if( (cars.get(c)-defTime) % perTime != 0){
                   fee += ((cars.get(c)-defTime) / perTime + 1) * perFee;
               }else{
                   fee += ((cars.get(c)-defTime) / perTime) * perFee;
               }
           }
           answer[a++] = fee; 
        }
        
        return answer;
    }
}
profile
일단 해보자 뭐든 되겠지 😄

0개의 댓글