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

AMUD·2022년 9월 13일
0

Algorithm

목록 보기
38/78

문제


문제링크

접근

  • Hashmap을 통하여 키-값을 통한 여러 가지 연산을 통해 구현하였다.
  • 테케도 통과하였는데, 일부 문제들에서 런타임 오류가 생겼다.
  • 이를 질문 게시판에서 확인하니 아래와 같은 이유라는 것을 알게 되어 수정하니 해결되었다.
    (감사합니당)

소스 코드

import java.time.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws Exception {
        int[] fees = {180, 5000, 10, 600};
        String[] records = {"05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"};

        Solution sol = new Solution();
        System.out
                .println("result : " + sol.solution(fees, records)[0] + " " + sol.solution(fees, records)[1] );
    }
}

class Solution {
    public int[] solution(int[] fees, String[] records) {
        HashMap<String, LocalTime> carIns = new HashMap<String, LocalTime>();
        HashMap<String, Integer> carTimes = new HashMap<String, Integer>();

        for (String s : records) {
            String[] strs = s.split(" ");

            // 이미 들어온 차라면
            if (strs[2].equals("OUT")) {
                String[] timeStrs = strs[0].split(":");

                Duration duration = Duration.between(carIns.get(strs[1]), LocalTime.of(Integer.parseInt(timeStrs[0]), Integer.parseInt(timeStrs[1]), 00));
                int minutes = (int) duration.getSeconds() / 60;

                if (carTimes.containsKey(strs[1])) {
                    carTimes.replace(strs[1], carTimes.get(strs[1]) + minutes);
                } else {
                    carTimes.put(strs[1], minutes);
                }
                carIns.remove(strs[1]);
            }

            else {
                String[] timeStrs = strs[0].split(":");
                carIns.put(strs[1], LocalTime.of(Integer.parseInt(timeStrs[0]), Integer.parseInt(timeStrs[1]), 00));
            }
        }

        for (String key : carIns.keySet()) {
            Duration duration = Duration.between(carIns.get(key), LocalTime.of(23, 59, 00));
            int minutes = (int) duration.getSeconds() / 60;

            if (carTimes.containsKey(key)) {
                carTimes.replace(key, carTimes.get(key) + minutes);
            } else {
                carTimes.put(key, minutes);
            }
        }

        Object[] mapkey = carTimes.keySet().toArray();
		Arrays.sort(mapkey);

        int[] answer = new int[mapkey.length];
        int i = 0;
        for (Object key : mapkey) {
            int minutes = carTimes.get(key);
            int currFee = fees[1];

            if (minutes > fees[0]) {
                currFee += Math.ceil((double) (minutes - fees[0]) / (double) fees[2]) * fees[3];
            }

            answer[i] = currFee;
            i++;
        }

        return answer;
    }
}
profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글