본문으로 바로가기

[level2] 주차 요금 계산 JAVA

category 코딩테스트/programmers 2022. 11. 15. 18:01

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. Car 클래스를 생성해준다.

class Car {
	int number;
	int hour;
	int min;
	int sum;
	
	public Car(int number, int hour, int min) {
		super();
		this.number = number;
		this.hour = hour;
		this.min = min;
	}
	
	public Car(int number, int sum) {
		super();
		this.number = number;
		this.sum = sum;
	}
}

2. 입차("IN") 를 HashMap<차번호, Car 정보>  hm로 담는다.

3. 출차("OUT") 인 경우는 hm에서 car 객체를 가져와 주차시간 계산한다.

4. 계산한 주차시간은 다시 HashMap<차번호, 주차누적시간>으로 담는다. 

5. hm 이 모두 비어있는 지를 확인한다. 

import java.util.*;
 

class Car {
	
	int number;
	int hour;
	int min;
	int sum;
	
	public Car(int number, int hour, int min) {
		super();
		this.number = number;
		this.hour = hour;
		this.min = min;
	}
	
	public Car(int number, int sum) {
		super();
		this.number = number;
		this.sum = sum;
	}
}

public class Main {
	
	static int[] answer;
	
	public int[] solution(int[] fees, String[] records) {    
        
        //입차
        HashMap<Integer, Car> hm = new HashMap<Integer, Car>();
        //총 누적 시간
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        
        for(int i = 0; i < records.length; i++) {
        	String str = records[i];
        	int hh = Integer.parseInt(str.substring(0, 2));
        	int mm = Integer.parseInt(str.substring(3, 5));
        	int carNum = Integer.parseInt(str.substring(6, 10));
        	String checkOut = str.substring(11);
        	
        	if(checkOut.equals("IN")) {
        		Car car = new Car(carNum, hh, mm);
        		hm.put(carNum, car);
        	}else {
        		Car car = hm.get(carNum);
        		hm.remove(carNum);
        		int time = calTime(car.hour, car.min, hh, mm);
        		map.put(carNum, map.getOrDefault(carNum, 0)+time);
        	}
        }
        
        if(!hm.isEmpty()) {
        	for(int carNum : hm.keySet()) {
        		Car car = hm.get(carNum);
        		int time = calTime(car.hour, car.min, 23, 59);
        		map.put(carNum, map.getOrDefault(carNum, 0)+time);
        	}
        }
        
        ArrayList<Car> list = new ArrayList<Car>();
        for(int carNum : map.keySet()) {
        	int time = map.get(carNum);
        	int sum = fees[1];
    		if(time > fees[0]) {
    			time -= fees[0];
    			int cnt = (time)/fees[2];
        		if(time%fees[2] != 0) cnt++;
        		sum += (fees[3] * cnt); 
    		};
    		
    		list.add(new Car(carNum, sum));
        }
        
        Collections.sort(list, new Comparator<Car>() {

			@Override
			public int compare(Car o1, Car o2) {
				// TODO Auto-generated method stub
				return o1.number - o2.number;
			}
		});
        
        answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
        	answer[i] = list.get(i).sum;
        }
        
        return answer;
    }
	
	private int calTime(int hour, int min, int hh, int mm) {
		if(mm < min) {
			hh -= 1;
			mm += 60;			
		} 
		
		int time = (hh - hour) * 60 + (mm-min);
		
		return time;
	}
 
}