[코딩테스트 - Java] 프로그래머스 - 주차 요금 계산

김수빈·2022년 8월 10일
0

코딩테스트

목록 보기
3/16

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

프로그래머스 - 카카오 주차 요금 계산 - LV2

각 자동차 별로 주차 요금을 계산하는 문제였다. 처음에 문제를 잘못 읽어서 입/출차 마다 요금 계산인 줄 알았는데, 아니였다.

  1. 차량 번호와 요금을 담는 차량요금 해시맵, 차량 번호와 입출차 기록을 담는 입출차 기록 해시맵을 만든다.

  2. 차량 요금 해시맵에 처음 들어오면 해당 차량과 0원을 추가한다.

2-1. 차량 ArrayList에 해당 차를 추가한다. (차량 번호 기준 정렬 용도)

  1. 입차 기록이 들어왔을 때는 입출차 기록 해시맵에 추가한다.

  2. 출차 기록이 들어왔을 때는 입출차 기록 해시맵에서 삭제하고, 차량요금 해시맵에서 요금값을 업데이트 한다.

  3. 모든 기록을 순회하고, 입출차 기록 해시맵에 존재하는 차량(입차는 했지만 출차를 하지 않은 경우) 목록을 이용해서 차량요금 해시맵의 요금값을 업데이트한다.

  4. 2-1 에서 만든 ArrayList와 차량요금 해시맵을 이용해서 차량 번호를 기준으로 정렬된 요금값을 계산한다.

import java.util.HashMap;
import java.util.Collections;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        // fees[0]  기본시간(분)
        // fees[1]  기본요금
        // fees[2]  단위시간(분)
        // fees[3]  단위요금

        // 차량번호와 시간 담기
        HashMap<String,Integer> carAndTime = new HashMap<>();

        // 입차 차량의 번호와 입차시간
        HashMap<String,Integer> carAndIO = new HashMap<>();
        
        // 자동차 리스트
        ArrayList<String> cars = new ArrayList<>();
        
        for(String data : records){
            // records에 들어온 값을 파싱
            //  시간 / 차 번호 / 입,출
            String[] inf = data.split(" ");
            int timeInfo = getMin(inf[0]);
            String carNum=inf[1];
            String inOrOut=inf[2];
            /*
            int timeInfo = getMin(data.substring(0,5));
            String carNum = data.substring(6,10);
            String inOrOut = data.substring(11,data.length());
            */
            if(!carAndTime.containsKey(carNum)){
                carAndTime.put(carNum,0);
                cars.add(carNum);
            }
            
            // 입차 일 경우 입차 해시맵에 추가
            if(inOrOut.equals("IN")){
                carAndIO.put(carNum,timeInfo);
            }
            
            // 출차 일 경우 해당 차의 누적시간에 추가 후 입차 해시맵에서 삭제
            else{
                // 입차시간
                int in = carAndIO.get(carNum);

                // 출차시간 - 입차시간 (분)
                int totalTime = timeInfo-in;

                carAndTime.put(carNum,carAndTime.get(carNum)+totalTime);

                carAndIO.remove(carNum);
            }

            //System.out.println(timeInfo+" 시 "+carNum+" 번 "+inOrOut);
        }
        if(!carAndIO.isEmpty()){
            for(String data : carAndIO.keySet()){
                carAndTime.put(data,carAndTime.get(data)+1439-carAndIO.get(data));
                //System.out.println(data);
            }
        }
        
        Collections.sort(cars);
        int[] answer = new int[cars.size()];
        for(int i=0;i<cars.size();i++){
            answer[i]=calcFee(fees,carAndTime.get(cars.get(i)));
        }


        return answer;
    }
	
    // HH:MM 형태로 나온 시간을 분 으로 바꾸는 메소드
    public static int getMin(String time){
        return Integer.parseInt(time.substring(0,2))*60+Integer.parseInt(time.substring(3,5));
    }

	// 요금표와 주차시간을 바탕으로 총 요금을 계산하는 메소드
    public static int calcFee(int[] fees, int min){
        // 기본시간 이하 일 시
        if(min<=fees[0]){
            // 기본요금 
            return fees[1];
        }
        else{
            // 기본 시간을 제외한 초과 시간 
            // 단위 시간을 초과할 때 마다 요금을 추가
            int a = (int)Math.ceil((min-fees[0])/(double)fees[2]);
            return fees[1]+a*fees[3];
        }
    }
    
}

0개의 댓글