[프로그래머스]주차 요금 계산 with Java

hyeok ryu·2024년 4월 30일
0

문제풀이

목록 보기
126/154

문제

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


입력

  • 주차 요금을 나타내는 정수 배열 fees
  • 자동차의 입/출차 내역을 나타내는 문자열 배열 records

출력

  • 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return

풀이

제한조건

  • 같은 시각에, 같은 차량번호의 내역이 2번 이상 나타내지 않습니다.
  • 마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지 않습니다.
  • 잘못된 입력은 주어지지 않습니다

접근방법

단순 구현
특별한 알고리즘적 기술을 요구하지 않는 문제이다.

입력의 범 수가 많지 않고, 제한조건을 통해 특이한 형태의 입력이 없다는것이 보장되어 있다.
단순히 요구하는 기능만 구현하면 된다.

각 차량별 전체 주차 시간을 저장할 Map과 차량별 입출차 시간을 저장할 Map을 선언해주자.

// 출력 시, 차량번호는 정렬되어 있다.
Map<String, Integer> parkingTime = new TreeMap<>();

// 계산 용도로 사용, 정렬될 필요가 없다.
Map<String, Integer> parkingRecordMap = new HashMap<>();

OUT으로 마지막 입력이 주어지지 않은 차량에 대해서는 23:59시각에 반드시 강제 출차 처리됨을 주의하자.

마지막으로 차량별 전체 주차 시간이 저장된 Map을 순회하며 가격을 계산해주자.
이때, 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림하여 계산함을 주의하자.


코드

import java.util.*;

public class Solution {
	Map<String, Integer> parkingTime = new TreeMap<>();
	Map<String, Integer> parkingRecordMap = new HashMap<>();

	public int[] solution(int[] fees, String[] records) {
		for (String record : records) {
			String[] inputs = record.split(" ");
			int time = getTime(inputs[0]);
			if (inputs[2].equals("IN")) {
				parkingRecordMap.put(inputs[1], time);
			} else {
				int diff = time - parkingRecordMap.get(inputs[1]);
				parkingTime.put(inputs[1], parkingTime.getOrDefault(inputs[1], 0) + diff);
				parkingRecordMap.remove(inputs[1]);
			}
		}

        // 23:59에 강제 출차 처리
		int last = getTime("23:59");
		for (String key : parkingRecordMap.keySet()) {
			int diff = last - parkingRecordMap.get(key);
			parkingTime.put(key, parkingTime.getOrDefault(key, 0) + diff);
		}
        
		int[] answer = new int[parkingTime.size()];
		int idx = 0;
		for (String key : parkingTime.keySet()) {
			int time = parkingTime.get(key);
			answer[idx] += fees[1]; // 기본요금 부과

			if (time > fees[0]) { // 추가요금 부과
				if ((time - fees[0]) % fees[2] == 0)
					answer[idx] += ((time - fees[0]) / fees[2]) * fees[3];
				else
					answer[idx] += ((time - fees[0] + fees[2]) / fees[2]) * fees[3];
			}

			idx++;
		}
		return answer;
	}

	private int getTime(String input) {
		String[] split = input.split(":");
		return Integer.parseInt(split[0]) * 60 + Integer.parseInt(split[1]);
	}
}

0개의 댓글