코딩문제풀이/프로그래머스

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

코딩하는 포메라니안 2022. 9. 27. 23:06

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

 

 

2. 풀이 과정

HashMap에 <차_번호, int[] {입/출차기록, 총_시간}>을 기록한다.

- 입/출차 기록 : 입차할 때는 +1, 출차할 때는 -1을 해서 마지막에 요금을 계산할 때 1이면 23:59분으로 출차!

- 총_시간 : 입차할 때는 -minute, 출차할 때는 +minute으로 총 시간을 계산한다.

 

Key들을 정렬해서, 차례대로 가격을 계산해서 결과를 출력한다.

import java.util.*;

class Solution {
    public int htom(String h){
        String[] time = h.split(":");
        return Integer.parseInt(time[0])*60 + Integer.parseInt(time[1]);
    }
    
    public int calculate(int[] fees, int[] status){
        int result = 0;
        if(status[0]>0){status[1]+=htom("23:59");}//출차
        //기본 요금
        status[1] = Math.max(0, status[1]-fees[0]);
        result+=fees[1];
        //단위 요금
        result += (status[1]+fees[2]-1)/fees[2]*fees[3];
        return result;
    }
    
    public int[] solution(int[] fees, String[] records) {
        Map<String, int[]> cars = new HashMap<>();//입차+1, 출차-1 | 시간 합
        
        StringTokenizer st = null;
        for(String record : records){
            st = new StringTokenizer(record);
            int minute = htom(st.nextToken());
            String carNum = st.nextToken();
            int[] status;
            switch(st.nextToken()){
                case "IN":
                    status = cars.getOrDefault(carNum, new int[]{0, 0});
                    status[0]++;
                    status[1]-=minute;
                    cars.put(carNum, status);
                    break;
                case "OUT":
                    status = cars.get(carNum);
                    status[0]--;
                    status[1]+=minute;
                    cars.put(carNum, status);
                    break;
            }
        }
        Set<String> set = cars.keySet();
        String[] numbers = set.toArray(new String[set.size()]);
        Arrays.sort(numbers);
        int[] answer = new int[set.size()];
        int idx = 0;
        for(String number : numbers){
            answer[idx++] = calculate(fees, cars.get(number));
        }
        return answer;
    }
}

 

 

Map, HashMap관련 메서드가 바로 생각나지 않았다..

또 집합을 문자열배열로 변환하는 과정은 거의 초면이라서 익숙해져야겠다!