2022 KAKAO BLIND RECRUITMENT - 주차 요금 계산

Updated:

Java

주차 요금 계산

문제

접근 방법

Map과 Set을 사용하여 해결하였다.

코드

import java.util.*;
import java.util.Map.Entry;

class Solution {
	static public int[] solution(int[] fees, String[] records) {
        int[] answer = {};

        Map<String, Integer> pkLot = new HashMap<>();
        Map<String, Integer> carTime = new HashMap<>();
        Set<String> cars = new HashSet<>();
        StringTokenizer stk;
        String carNum;
        int curT, lastT;
        boolean isIn;
        for(String rec : records) {
        	stk = new StringTokenizer(rec);

        	// 입력 record 변환
        	curT = strToInt(stk.nextToken());
        	carNum = stk.nextToken();
        	cars.add(carNum);
        	if(stk.nextToken().equals("IN")) {
        		isIn = true;
        	}
        	else
        		isIn = false;

        	// 출차
        	if(!isIn) {
        		lastT = pkLot.get(carNum);
        		pkLot.remove(carNum);
        		// 그 동안의 주차 시간을 기록
        		carTime.put(carNum, carTime.getOrDefault(carNum, 0) + curT - lastT);
        	}
        	else {	// 입차
        		pkLot.put(carNum, curT);
        	}
        }
        // 하루가 끝날때 까지 출차되지 않은 차들
        List<Entry<String, Integer>> mapList = new ArrayList<>(pkLot.entrySet());
        curT = strToInt("23:59");

        for(Entry<String, Integer> en : mapList) {
        	lastT = en.getValue();
        	carTime.put(en.getKey(), carTime.getOrDefault(en.getKey(), 0) + curT - lastT);
        }

    	// 금액 계산
    	int calM = 0;
    	double calT;
    	int basicT = fees[0];
    	int basicM = fees[1];
    	double perT = fees[2];
    	int perM = fees[3];

    	mapList = new ArrayList<>(carTime.entrySet());
        String car;
        Map<String, Integer> carFee = new HashMap<>();
        for(Entry<String, Integer> en : mapList) {
        	calM = basicM;
        	car = en.getKey();
        	curT = en.getValue();
        	// 기본 시간보다 오래 있었으면
        	if(curT > basicT) {
        		calT = (curT - basicT) / perT;
        		calM += (Math.ceil(calT) * perM);
        	}

        	carFee.put(car, calM);
        }
    	List<String> list = new ArrayList<>(cars);
        Collections.sort(list);

        int len = cars.size();
        answer = new int[len];
        for(int i = 0; i < len; i++) {
        	answer[i] = carFee.get(list.get(i));
        }

        return answer;
    }

    static int strToInt(String time) {
    	String[] sp = time.split(":");
    	return 60 * Integer.parseInt(sp[0]) + Integer.parseInt(sp[1]);
    }

    static int stoi(String str) {
    	return Integer.parseInt(str);
    }

    public static void main(String[] args) {
    	int[] fees = {1, 461, 1, 10};
    	String[] records = {"00:00 1234 IN"};

    	System.out.println(Arrays.toString(solution(fees, records)));
	}
}

총평

후기

개선할 점