본문 바로가기
JAVA

[프로그래머스] 주차 요금 계산 (JAVA)

by Son 2022. 11. 12.

https://campus.programmers.co.kr/courses/15436/lessons/132822

 

프로그래머스

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

programmers.co.kr

필요한 조건

1.차가 주차장에 들어왔을때 현재 주차되어 있는 차의 정보를 나타낼 MAP

2.차들의 누적 주차시간을 가지고 있는 MAP

3.주차되어 있는 자동차 리스트

 

추차한시간 차넘버 주차 출차여부를 먼저 spilt으로 분리시킨다

 

*주차시간 계산하는 방법

예를 들어 6시에 주차장으로 들어와서 6시34분에 주차장을 나갔을 경우에

1시간이 60분이므로 6*60 +분 으로 계산해준다 즉 (6*60+34) - (6*60) 을 해주면 된다

그리고 추가요금이 발생했을때 소수점으로 나온다면 모두 올림을 하라고 했으므로 ceill 함수를 사용하고 기본요금인 180을빼주어 0과 비교하는데 여기서 0을 비교해주는 이유는 기본시간인180분 이하로 주차했을 경우는 기본요금을 청구하기 위해서이다

import java.util.*;
class Solution {
    public int[] solution(int[] fees, String[] records) {
       //23:59분까지 출차를 하지 않았을 경우 23:59분에서 입고한 시간만큼 빼주기 위한 변수
       int lastTime = getMin("23:59");
        // 현재 파킹 중인 차들
		Map<String, Integer> parking = new HashMap<>();
        // 차들의 누적 파킹시간
		Map<String, Integer> times = new HashMap<>();
        // 차들 list
		List<String> cars = new ArrayList<>();
		
		for(String record : records) {
			String[] rc = record.split(" ");
			int time = getMin(rc[0]); //주차한 시간
			String car = rc[1];  //자동차 넘버
			
            // 새롭게 자동차가 주차한 경우
			if(!cars.contains(car)) { //현재 주차장에 자동차가 없을경우 = 리스트에 자동차 넘버가 없을 경우
				cars.add(car); //추가
				times.put(car, 0);  //추가 벨류값은 자동차의 주차 시간 0으로 초기화
			}
			
			if(parking.containsKey(car)) {
            	// 현재 파킹이 되어 있다면 출차다
				times.put( car, times.get(car)+(time-parking.get(car)) );
				parking.remove(car);
			} else {
            	// 파킹이 안되어 있다면 입차다.
				parking.put(car, time);
			}
			
		}
		
		int[] ret = new int[cars.size()];
        	// 차번 순으로 정렬
		Collections.sort(cars);
		
		for(int i=0 ; i<cars.size() ; i++) {
        		// 기본요금
			ret[i] = fees[1];
			String car = cars.get(i);
            		// 누적시간중 기본요금 시간 제외
			int time = times.get(car)-fees[0];
            		// 아직 출차가 안되었다면 마지막시간으로 정산
			if(parking.containsKey(car)) time += (lastTime-parking.get(car));
            		// 요금 정산
			if(time>0) ret[i] += (Math.ceil(time/(fees[2]*1.0))*fees[3]);
		}
		
		return ret;
    }
    
    // Convert time String to Integer
    public int getMin(String time) {
		String[] t = time.split(":");
		return Integer.valueOf(t[0])*60+Integer.valueOf(t[1]);
	}
    
}