프로그래머스 - 주차 요금 계산기

leehyunjon·2022년 5월 5일
0

Algorithm

목록 보기
27/162

주차 요금 계산기 : https://programmers.co.kr/learn/courses/30/lessons/92341


Problems


Solve

어려운 문제는 아니였다. 하지만 몇몇의 조건을 잘못 설정하고 예외처리를 하면서 시간을 많이 잡아먹고 풀어서 좀 아쉬웠던 문제랄까..

Map을 두개 사용해서 하나는 누적시간(completeMap), 다른 하나는 출입했을때 시간을 저장하는 용(inMap)으로 사용했다.
차가 처음으로 들어왔을때는 inMap에 시간을 int로 변환해서 넣고 들어온 차를 저장하는 list에 저장해놓는다.
그리고 해당 차가 출차 했을때 completeMap에 출차 시간 - 입차 시간으로 누적 시간을 저장하고 입차 list에서 해당 차를 삭제한다.
그리고 출차 기록이 없는 차는 23:59분에 출차한다는 조건이 있기 때문에 입차 list에 남아있는 차를 1439(23:59) - 입차 시간으로 completeMap에 시간을 갱신해준다.


Code

import java.util.*;
class Solution {
    int basicTime;
    int basicCost;
    int perTime;
    int perCost;
    public int[] solution(int[] fees, String[] records) {
        basicTime = fees[0];
		basicCost = fees[1];
		perTime = fees[2];
		perCost = fees[3];

		//누적 시간 저장
		HashMap<String, Integer> completeMap = new HashMap<>();
        //입차 시간 저장
		HashMap<String, Integer> inMap = new HashMap<>();
        //입차 리스트
        List<String> inCarList = new ArrayList<>();
		for(String record : records){
			String[] rArr = record.split(" ");
			int time = s2i(rArr[0]);
			String number = rArr[1];
			String event = rArr[2];

			//입차 시 입차 시간 map에 입차 시간을 저장, 입차 리스트에 차번호 저장
			if (event.equals("IN")) {
				inMap.put(number, time);
				inCarList.add(number);
			} else {
            //출차 시 누적 시간 map에 누적 시간 저장, 입차 리스트에서 차번호 제거, 입차 시간 map의 값 0으로 갱신
				completeMap.put(number, completeMap.getOrDefault(number, 0) + time - inMap.get(number));
				inMap.put(number, 0);
				inCarList.remove(number);
			}
		}

		int lastTime = 23 * 60 + 59;
        //출차 기록이 없는 차량의 누적 시간 계산
		for (String n : inCarList) {
			int time = lastTime - inMap.get(n);
			completeMap.put(n, completeMap.getOrDefault(n,0) + time);
		}


		//[0] : 차량 번호, [1] : 누적시간
		int[][] carInfos = new int[completeMap.size()][2];
		int idx=0;
		for(String n : completeMap.keySet()){
			carInfos[idx][0] = Integer.parseInt(n);
			carInfos[idx][1] = completeMap.get(n);
			idx++;
		}

		Arrays.sort(carInfos, new Comparator<int[]>(){
			@Override
			public int compare(int[] o1, int[]o2){
				return o1[0]-o2[0];
			}
		});


		int[] answer = new int[carInfos.length];
        //차량 요금 계산
		for(int i=0;i<carInfos.length;i++){
			answer[i] = getCost(carInfos[i][1]);
		}

		return answer;
    }
    
    //차량 요금 계산
    int getCost(int time){
    	//누적 시간이 기본 시간보다 작다면 기본 요금
        if(time <= basicTime) return basicCost;
		int timeCost = (time-basicTime)/perTime;
        //반올림
		if((time-basicTime)%perTime > 0){
			timeCost+=1;
		}
		return (timeCost*perCost)+basicCost;
    }
    
    //string 시간 -> int 시간
    int s2i(String time){
        String[] t = time.split(":");
        int h = Integer.parseInt(t[0])*60;
        int m = Integer.parseInt(t[1]);
        return h+m;
    }
}

Result


Reference

profile
내 꿈은 좋은 개발자

0개의 댓글