코딩테스트(Java)/프로그래머스 2단계

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

영드로이드개발자 2024. 2. 29. 00:42
반응형

문제

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

 

프로그래머스

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

programmers.co.kr

입출력

이 문제는 2022 카카오 블라인드 채용에 나온 문제인데 단순 구현 문제임에도 불구하고 아직 실력이 많이 부족해 시간이 좀 오래걸렸던 문제이다.. ㅠㅠ

문제 자체가 어렵지는 않았지만 시간이 조금 오래 걸렸다는 점에서 아직 연습이 많이 부족함을 느꼈다.

더 좋은 방법이 있다면 공유 부탁드립니다.

 

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

class Solution {

    static final String IN = "IN";
    static final String OUT = "OUT";
    static final String lastTime = "23:59";
    static final int HOUR = 24;
    static final int MINUTE = 60;

    static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

    public static void main(String[] args) throws ParseException {
        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"};

        System.out.println(Arrays.toString(solution(fees, records)));
    }

    static public int[] solution(int[] fees, String[] records) throws ParseException {
        int[] answer;

        int baseTime = fees[0];
        int baseFee = fees[1];
        int unitTime = fees[2];
        int unitFee = fees[3];
        
        LinkedHashMap<String, String> carRecordsMap = new LinkedHashMap<>();
        HashMap<String, Integer> carTimeMap = new HashMap<>();
        

        for (String record : records) {
            StringTokenizer st = new StringTokenizer(record);

            String inTime = st.nextToken();
            String carNumber = st.nextToken();
            String inOut = st.nextToken();

            if (inOut.equals(IN)) {
                carRecordsMap.put(carNumber, inTime);
            } else {
                int minute = getTimeMinute(carRecordsMap.get(carNumber), inTime);

                if (carTimeMap.containsKey(carNumber)) {
                    carTimeMap.put(carNumber, minute + carTimeMap.get(carNumber));
                } else {
                    carTimeMap.put(carNumber, minute);
                }

                carRecordsMap.remove(carNumber);
            }

        }

        // OUT 이 없는 차 추출
        for (String key : carRecordsMap.keySet()) {
            int minute = getTimeMinute(carRecordsMap.get(key), lastTime);

            if (carTimeMap.containsKey(key)) {
                carTimeMap.put(key, minute + carTimeMap.get(key));
            } else {
                carTimeMap.put(key, minute);
            }
        }


        // 자동차의 번호를 오름차순으로 정렬
        ArrayList<String> keySet = new ArrayList<>(carTimeMap.keySet());
        Collections.sort(keySet);
        
        int[] sortedCarArr = new int[keySet.size()];
        
        for (int i = 0; i < keySet.size(); i++) {
            sortedCarArr[i] = carTimeMap.get(keySet.get(i));
        }

        ArrayList<Integer> resultArrayList = new ArrayList<>();
        
        // 정렬된 자동차 번호 순서로 각 자동차들의 주차요금을 계산
        for (int x : sortedCarArr) {
            int totalMinute = x;
            int X; // 몫 
            boolean check = false; // 10분단위로 떨어지는지 확인하여 안떨어지면 올림 처리 (단위 금액 한번 추가)
            if (totalMinute <= baseTime) {
                resultArrayList.add(baseFee);
                continue;
            } else {
                totalMinute = totalMinute - baseTime;
                if (totalMinute % unitTime != 0) {
                    check = true;
                }
                X = totalMinute / unitTime;
            }
            int result = baseFee + (X * unitFee);
            if (check) result = result + unitFee;
            resultArrayList.add(result);
        }
        
        answer = new int[resultArrayList.size()];
        
        for (int i = 0; i < answer.length; i++){
            answer[i] = resultArrayList.get(i);
        }

        return answer;
    }
    
    static public int getTimeMinute(String time, String afterTime) throws ParseException {
        Date date1 = sdf.parse(time);
        Date date2 = sdf.parse(afterTime);

        long timeMil1 = date1.getTime();
        long timeMil2 = date2.getTime();

        long diff = timeMil2 - timeMil1;

        return Long.valueOf(diff / (1000 * 60)).intValue();
    }
    
}

느낀점

단순한 구현문제인데 푸는 방식이 너무 원초적인게 아닌가 생각이 드는 문제이다. 더 빠르고 쉽게 푸는 방법은 없는지 알아 봐야할 것 같고, 아직 연습이 많이 부족하기에 더 열심히 노력해야겠다.

반응형