프로그래머스(카카오 기출) | LV.2 주차 요금 계산 - 단순 구현 문풀 (Java)

728x90

⬛ 프로그래머스(카카오 기출) | LV.2 주차 요금 계산 - 단순 구현 문풀

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

 

프로그래머스

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

programmers.co.kr

설명1
설명 2


💚문제 접근 방식

1) HashMap<String, Integer> 형태를 활용해서 입/출차 정보를 기록하려고 했다.

→ key로 식별할 차 번호는 String으로 담고,

→ value에는 차량 별 주차시간 (분) 이 담기도록 했다.

2) 데이터 기록 후, map의 value 값이 0보다 작거나 같은 케이스 처리

주의 사항에 보면, 입차 정보만 있고, 출차 정보가 없는 경우 23:59 에 출차했다고 처리하라는 말이 있다.

🎈내가 푼 방식에서는 입차 정보에 대해 time만큼 value를 빼주기 때문에
입차 정보는 있고 출차 정보가 없다면 반드시 time은 음수로 존재할 줄 알았다. 

그런데, 출차 없이 time이 0인 경우도 있었다. 
[00:00] 에 입차할 경우가 그렇다. (케이스 3번째에 해당)

3) List<Integer>에 차량번호 오름차순 정렬하여 ← 정렬된 key 로 접근해서 요금 계산해줌

문제에서 answer는 차량번호 오름차순이라고 되어 있고, HashMap 자체로는 key 정렬이 안되기 때문에 List를 활용해서 key만 정렬시키고, 순차적으로 key에 접근해서 정답을 세팅했다.

4) 요금 계산 및 정답 세팅

    (1) 시간 ≤ 기본 요금 : 기본 요금만 세팅

    (2) 시간 > 기본 요금 : 이 경우, 정확히 나눠 떨어지지 않으면 올림 하라는 말이 있다. 그래서 Math.ceil() 함수로 올렸다.

💚 제출 코드

import java.util.*;

class Solution {
    //getTime
    private static int getTime(String time){
        int H = Integer.parseInt(time.split(":")[0]);
        int M = Integer.parseInt(time.split(":")[1]);
        
        return 60 * H + M;
    }
    //솔루션 함수 
    public List<Integer> solution(int[] fees, String[] records) {
        //map <차량번호, 총 주차 시간> 
        HashMap<String, Integer> map = new HashMap<>();
        
        for(String x : records){
            String t = x.split(" ")[0];
            String n = x.split(" ")[1];
            String v = x.split(" ")[2];

            int time = getTime(t);
            if(map.containsKey(n)){ //이미 존재하는 차량인 경우 
                int val = map.get(n);
                if(v.equals("IN")){
                    val -= time;
                }else{//OUT
                    val += time;
                }
                map.put(n, val);
            }else{//아닌 경우 
                if(v.equals("IN")){
                    map.put(n, -time);
                }else { //OUT
                    map.put(n, time);
                }
            }
        }
        
        List<String> keySet = new ArrayList<>(map.keySet());
        Collections.sort(keySet);
        
        for(String key : keySet){
            if(map.get(key) <= 0){
                int val = map.get(key);
                int time = getTime("23:59");
                val += time;
                map.put(key, val);
            }
            System.out.println(key + " " + map.get(key));
        }
        
        List<Integer> answer = new ArrayList<>();
        
        for(String key : keySet){
            int basic_time = fees[0];
            int basic_price = fees[1];
            int unit_time = fees[2];
            int unit_price = fees[3];
            
            //요금 = 기본 요금 + (시간-기본시간)/단위시간 * 단위 요금
            if(map.get(key) != 0 &&map.get(key) <= basic_time){
                answer.add(basic_price);
            }else{
                int totalParkingTime = map.get(key);
                int excessTime = totalParkingTime - fees[0];
                int fee = (((int)Math.ceil(((double)excessTime) / fees[2])) * fees[3]) + fees[1];
                answer.add(fee);
            }
        }
        
        return answer;
    }
}

💚 회고

이 문제의 경우는 알고리즘이 특별히 있다기 보다는, 문제가 요구하는 흐름대로 따라가서 구현을 잘 하면 되는 문제이다.

주의 사항을 잘 읽어야 하고, 논리적으로 처리해야 할 부분을 쪼개서 처리해야 한다.

728x90