본문 바로가기
알고리즘/프로그래머스

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

by hxxyeoniii 2024. 11. 5.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 풀이

1. records를 차례대로 입력받으며

1.1 입차일 경우, map에 저장하고

1.2 출차일 경우, 누적시간을 계산해 calculateMap에 저장 + map에서는 삭제 해준다.

 

2. map에 남아있는 자동차가 있는 경우 출차를 하지 않은 차량이므로 23:59 출차를 했다고 가정하고 calculateMap에 마저 저장해준다.

3. calculateMap에 저장된 자동차들을 차례로 돌며 요금을 계산해준다.

 

 

* 차량 번호가 작은 자동차부터 정답을 출력해야 하므로 트리맵을 사용해준다.

-> 트리맵은 키 값에 따라 오름차순으로 자동 정렬이 됨

 

* 주차요금 계산 시 Math.ceil() 사용에 주의해야 한다.

-> 정수형끼리 계산하면 결과도 정수형으로 나옴! = 정수형끼리 계산하면 소수점이 버려짐

ex) Math.ceil(10/4)를 할 경우, 3이 나올 것이라고 생각하기 쉬우나 결과는 2가 나온다.

따라서 올림이 되려면 Math.ceil(10.0/4.0)으로 해야 결과가 3이 나온다.

 

import java.util.*;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        Map<String, String> map = new HashMap<>(); // 배열 임시저장용
        Map<String, Integer> calculateMap = new TreeMap<>(); // 차번호, 누적시간 
        
        for(int i=0; i<records.length; i++) {
            String[] recordStr = records[i].split(" ");
            
            String timeStr = recordStr[0]; // 시간
            String carNum = recordStr[1]; // 차번호
            String inOut = recordStr[2]; // 입차 or 출차 여부
            
            if("OUT".equals(inOut)) {
                int time = calculateTime(map.get(carNum), timeStr);
                
                if(calculateMap.containsKey(carNum)) {
                    calculateMap.put(carNum, calculateMap.get(carNum) + time);
                } else {
                    calculateMap.put(carNum, time);
                }
                
                map.remove(carNum);
            } else if("IN".equals(inOut)) {
                map.put(carNum, timeStr);
            }
        }
        
        // map에 남아있는 차가 있다면 출차하지 않은 경우이므로 마저 계산
        if(map.size() > 0) {
            for(String carNum : map.keySet()) {
                int time = calculateTime(map.get(carNum), "23:59"); 
                
                if(calculateMap.containsKey(carNum)) {
                    calculateMap.put(carNum, calculateMap.get(carNum) + time);
                } else {
                    calculateMap.put(carNum, time);
                }
            }
        }
        
        // 주차요금 계산
        int[] answer = new int[calculateMap.size()];

        int cnt = 0;
        for(String carNum : calculateMap.keySet()) {
            int pay = fees[1];
			
            if(calculateMap.get(carNum) > fees[0]) {
                pay += Math.ceil( (float) (calculateMap.get(carNum) - fees[0]) / fees[2]) * fees[3];
            }
            answer[cnt] = pay;
            cnt++;
        }

        
        return answer;
    }

    // 입차 ~ 출차 까지의 시간 계산
    // 05:34, 07:59 입력 시 
    // 차이가 02:25 이므로 60 * 2 + 25 = 145 리턴
    private int calculateTime(String inTime, String outTime) {
        int time = 0;
        
        String[] orgnTime = inTime.split(":");
        int orgnHour = Integer.parseInt(orgnTime[0]); 
        int orgnMin = Integer.parseInt(orgnTime[1]); 
                
        String[] newTime = outTime.split(":");
        int newHour = Integer.parseInt(newTime[0]); 
        int newMin = Integer.parseInt(newTime[1]); 
                
        time = (newHour - orgnHour) * 60 + (newMin - orgnMin);
        return time;
    }
}