JAVA/Coding Test

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

오늘도개발 2024. 7. 10. 17:12

 

문제 : 

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

 

프로그래머스

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

programmers.co.kr

 

접근 : 

 

  - 입력 받은 기록이 In 인 경우에는 HashMap에 차량 번호를 key, 입차 시간을 value로 저장한다.

 

  - 입력 받은 기록이 Out 이면 HashMap을 조회해서 주차된 시간을 계산하여 park_time TreeMap에 저장 후 In에서 해당 데이터를 삭제한다.

 

  - 입력 받은 기록을 모두 처리한 후, In에 차량이 남아있으면 23:59 에 출차된 것으로 시간 계산을 하여 합산한다.

 

  - TreeMap 에서 키를 하나씩 꺼내서 요금을 계산하고 ans 배열에 저장 후 출력한다.

 

 

코드 구현 : 

import java.util.*;
class Solution {
    private int calTime(String in, String out){
        return (out.charAt(0)-in.charAt(0))*600 + (out.charAt(1)-in.charAt(1))*60
                    + (out.charAt(3)-in.charAt(3))*10 + (out.charAt(4)-in.charAt(4));
    }

    public int[] solution(int[] fees, String[] records) {
        Map<String, String> in = new HashMap<>();
        Map<String, Integer> park_time = new TreeMap<>();
            
        //차량 정보 저장 및 출차 시 주차 시간 저장
        for(String record : records){
            String[] line = record.split(" ");
            if(line[2].equals("IN")){
                in.put(line[1], line[0]);
                continue;
            }
            park_time.put(line[1], park_time.getOrDefault(line[1],0) + calTime(in.get(line[1]), line[0]));
            in.remove(line[1]);
        }

        //출차 기록이 없는 차량 정산
        for(String k : in.keySet()) {
            park_time.put(k, park_time.getOrDefault(k, 0) + calTime(in.get(k), "23:59"));
        }
        // 요금 환산 및 결과 저장
        int[] ans = new int[park_time.size()];
        int minute;
        Iterator<String> iter = park_time.keySet().iterator();
        int cnt = 0;
        while (iter.hasNext()){
            String str = iter.next();
            minute =  park_time.get(str) - fees[0];
            if(minute < 0){
                ans[cnt++] = fees[1];
                continue;
            }
            ans[cnt++] = fees[1] + ((minute/fees[2] + (minute%fees[2] == 0 ? 0 :1))*fees[3]);
        }
        return ans;
    }
}