Algorithm/Java

프로그래머스 - 주차 요금 계산 JAVA :: 2022 KAKAO BLIND RECRUITMENT

고고마코드 2022. 8. 1. 15:54
반응형
92341

코딩테스트 연습 - 주차 요금 계산 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr


풀이

📌주차요금 계산식

주차 요금 = 기본 요금 + [(주차 누적시간 - 기본시간) / 단위 시간] * 단위 요금

 

📌주차 누적시간

모든 주차 시간을 분단위로 변환하면 계산하기 편합니다. 

예를 들어 입차시간이 02:30 이면 (2*60) + 30 = 150

그리고 출차시간이 03:30 이면 (3*60) + 30 = 210

그러므로 주차 누적시간은 210(출차)-150(입차) = 60(분)


📌입차 후 출차기록이 없는 경우

입차 후 출차기록이 없는 경우는 23:59 로 가정한다고 합니다.

23:59 를 분단위로 변환하면 (23*60) + 59 = 1439(분) 입니다.

 

📝코드

import java.util.Map;
import java.util.TreeMap;

class Solution {
    public int[] solution(int[] fees, String[] records) {
		Map<String, Integer> map = new TreeMap<>();
		for (String record : records) {
			String[] split_record = record.split(" ");
			String[] split_time = split_record[0].split(":");
			int time = (split_record[2].equals("IN") ? -1 : 1) * ((Integer.parseInt(split_time[0]) * 60) + Integer.parseInt(split_time[1]));
			String carNumber = split_record[1];
			
			map.put(carNumber, map.getOrDefault(carNumber, 0) + time);
		}

		int i = 0, lastTime = 1439;
		int[] answer = new int[map.size()];
		for (String key : map.keySet()) {
			int time = map.get(key);
			time = time <= 0 ? time + lastTime : time;
			double baseTime = time-fees[0] < 0 ? 0 : time-fees[0];	
			int price = fees[1] + (int) Math.ceil(baseTime / fees[2]) * fees[3];
			answer[i++] = price;
		}

		return answer;
	}
}

 

🎈차량 별 주차요금 계산할 변수 map

map에 저장될 정보 : [차량번호, 누적 주차시간(분)]

 

🎈주차시간 계산

int time = (split_record[2].equals("IN") ? -1 : 1) * ((Integer.parseInt(split_time[0]) * 60) + Integer.parseInt(split_time[1]));

누적 주차시간을 계산하기 위해서 입차인 경우에는 마이너스, 출차인 경우 플러스로 주차시간을 계산합니다.

 

🎈누적 주차시간 계산

map.put(carNumber, map.getOrDefault(carNumber, 0) + time);

🔨 default V getOrDefault(Object key, V defaultValue)

map 내에 key가 있으면 해당 key의 value를 반환하고, key가 없으면 내가 지정한 defaultValue를 반환합니다.

 

🎈예시

차량번호 시각(시:분) => 시간(분) 입차/출차 합산할 누적 시간 => [ map ]
0000 01:30 => 90 입차 -90 => [ "0000", -90 ] 
0000 02:30 => 150 출차 +150 => [ "0000", 60 ]
0000 02:40 => 160 입차 -160 => [ "0000", -100 ]

이렇게 map에 각 차량번호와 누적시간을 계산해 저장합니다.

 

🎈출차기록이 없는 경우

int time = map.get(key);
time = time <= 0 ? time + lastTime : time;

조건에 입차 이후 반드시 출차가 이루어져야 합니다.

만약 입차 이후 출차가 이루어지지 않았다면 누적시간은 음수일 것입니다.

그러나 입차가 00:00이면 누적시간은 0인데 이 때에도 출차가 없을 수도 있으므로 time <= 0 으로 조건을 주었습니다.

해당 조건일 경우에는 자동으로 마지막 출차(23:59)를 누적시간에 더합니다.

 

🎈누적 주차시간이 기본 시간보다 작으면 추가로 낼 요금이 없으므로 0원 처리합니다.

double baseTime = time-fees[0] < 0 ? 0 : time-fees[0];

 

⚡정확성 테스트

테스트 1 통과 (0.76ms, 73.2MB)
테스트 2 통과 (0.68ms, 73.6MB)
테스트 3 통과 (0.92ms, 72.3MB)
테스트 4 통과 (1.72ms, 77MB)
테스트 5 통과 (2.13ms, 73MB)
테스트 6 통과 (2.14ms, 80.2MB)
테스트 7 통과 (7.01ms, 79.3MB)
테스트 8 통과 (5.04ms, 90.6MB)
테스트 9 통과 (2.14ms, 78.4MB)
테스트 10 통과 (7.27ms, 77.8MB)
테스트 11 통과 (7.02ms, 82.9MB)
테스트 12 통과 (6.85ms, 78.1MB)
테스트 13 통과 (0.78ms, 73.1MB)
테스트 14 통과 (0.68ms, 77.1MB)
테스트 15 통과 (0.57ms, 75.1MB)
테스트 16 통과 (0.59ms, 76.9MB)
반응형