본문 바로가기

프로그래머스/Level 2

프로그래머스(Lv.2) - 주차 요금 계산(Java)

 문제를 풀 때, 2개의 Map(HashMap, TreeMap)을 썼다.

 

parking(HashMap) : 변수명에서도 알 수 있듯이, 주차장과 같은 역할이다. 차량이 입차(IN)할 경우, 차량번호와 입차한 시간을 저장한다.

 

map(TreeMap) : 차량번호 별 총 주차시간을 저장할 것이다. TreeMap은 HashMap과 다르게 Key를 기준으로 오름차순이 되어 따로 정렬할 수고를 덜어준다.

 

 이 2개의 Map을 사용한다면, 그저 문제에 나와 있는 대로 하면 된다. 입차할 때 기록(parking) 해놓고 출차할 타이밍에 시간을 계산하여 저장한다(map) 그렇게 누적된 시간을 다시 꺼내어 요금을 계산해주면 되는데 내가 오랜 시간 애먹었던 부분이 계산하는 부분으로

초과한 시간이 단위 시간으로 나누어 떨어지지 않으면 올림한다. 이 부분으로 올림을 잘못 계산해 문제를 여러 번 곱씹었다.

<문제>

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

 

프로그래머스

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

programmers.co.kr


<소스코드>

import java.util.*;
/*
총 주차시간을 누적하여 한꺼번에 요금을 계산해준다.


*/
class Solution {
    static class Parking {
        String intime;
        String number;

        public Parking(String intime, String number) {
            this.intime = intime;
            this.number = number;
        }
    }

    static Map<String, Parking> parking;
    static Map<String, Integer> map;

    public int[] solution(int[] fees, String[] records) {
        int[] answer;
        parking = new HashMap<>();
        map = new TreeMap<>();

        for(int r = 0 ; r < records.length ; r++) 
        {
            String[] arr = records[r].split(" ");
            
            if(arr[2].equals("IN")) //입차할 경우
            {
                parking.put(arr[1], new Parking(arr[0], arr[1]));
            } 
            else if(parking.containsKey(arr[1])) //arr[1]이 있을 경우(= 입차했다가 출차한 경우)
            {
                Parking p = parking.get(arr[1]);
                
                int in = time_change(p.intime.split(":"));
                int out = time_change(arr[0].split(":"));
                
                int time = out - in;

                //값이 있으면 get(number), 아니면 0
                map.put(arr[1], map.getOrDefault(arr[1], 0) + time);
                parking.remove(arr[1]);
            }
        }

        for(String number : parking.keySet())  //입차만 하고 출차가 되지 않을 경우
        {
            Parking p = parking.get(number);
            
            int in = time_change(p.intime.split(":"));
            int time = (1439) - in;
            
            //값이 있으면 get(number), 아니면 0
            map.put(number, map.getOrDefault(number, 0) + time);
        }

        answer = new int[map.size()];
        int index = 0;

        for(String s : map.keySet()) {
            int time = map.get(s);
            int fee = fees[1];

            if(time > fees[0]) //초과시간 분의 계산
            {
                int tmp = (time - fees[0]) / fees[2];
                //나눠 떨어지지 않으면 올림
                fee += Math.ceil((double)(time - fees[0]) / fees[2]) * fees[3];
            }

            answer[index++] = fee;
        }

        return answer;
    }

    public static int time_change(String[] arr) //시간을 분으로 전환하는 함수
    {
        return (Integer.parseInt(arr[0]) * 60 + Integer.parseInt(arr[1]));
    }
}