본문 바로가기
Algorithm/programmers

2022 Kakao blind 92341 - 주차 요금 계산(해쉬, 정렬, 문자열파싱, 구현) - Java 풀이

by Ellery 2022. 3. 24.

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

- 하루동안(0분~23*60+59분) 주차장에 들어오고 나가거나, 이후에 안 나간 차에 대한 이용시간을 모두 카운트 한 뒤 주차요금 공식에 따라 계산한 요금값을 차량번호가 낮은 순서대로 정렬하면 된다. 
- 차량번호순으로 정렬하기 위해 트리맵을 이용하였다. 

import java.util.*;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        List<Integer> ans = new ArrayList<>();
        Map<String, Integer> parkTime = new HashMap<>();
        Map<String, Integer> totalTime = new TreeMap<>();
        
        int basicTime = fees[0];
        int basicFee = fees[1];
        int unitTime = fees[2];
        int unitFee = fees[3];
        
        for(String s: records) {
            StringTokenizer st = new StringTokenizer(s, ": ");
            int t = Integer.parseInt(st.nextToken()) * 60 + Integer.parseInt(st.nextToken());
            String num = st.nextToken();
            String cmd = st.nextToken();
            
            if(cmd.equals("IN")) parkTime.put(num, t);    
            else {
                int before = totalTime.getOrDefault(num, 0);
                totalTime.put(num, before + t - parkTime.get(num));
                parkTime.put(num, -1);
            }
        }
        
        for(String num: parkTime.keySet()) {
            int t = parkTime.get(num); // in 시간
            if(t != -1) {
                int before = totalTime.getOrDefault(num, 0);
                totalTime.put(num, before + 23*60+59 - t);
            }
        }
        
        for(String num: totalTime.keySet()) {
            int d = totalTime.get(num);
            int rate = basicFee;
            if(d > basicTime) {
                rate += ((int)Math.ceil((double)(d - basicTime) / unitTime)) * unitFee;
            }
            ans.add(rate);
        }
        
        return ans.stream().mapToInt(Integer::intValue).toArray();
    }
}