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

728x90

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

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

 

프로그래머스

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

programmers.co.kr

문제 설명


💚 문제 접근 방식

주의할 점은 입차는 있고, 출차는 없을 때 23:59 출차로 대체해야 하는 부분이다.

1) records[] 로 들어오는 배열 순회하며

  • time은 getTime으로 분 시간 교환
  • carNum 은 식별자로서 HashMap의 key에 세팅
  • inOut은 입차/출차 정보 구분용으로 (입차는 음수 시간) (출차는 양수 시간) 세팅

2) 빠져나온 상황에서 입차 정보는 있고 출차 없는 차량은 필수적으로 0보다 작거나 같은 value를 가질 것이므로 23:59 에 해당하는 시간으로 누적합 처리해줌

3) 요금 계산 시 차량 번호 오름차순이므로 keySet에 key에 대한 정렬 List 처리

4) 정렬된 KeySet 순회하며 각 car에 대한 누적 시간이 기본 시간 이하인지 초과인지에 따라 요금 처리

  • 기본 요금 초과의 경우, 나눠떨어지지 않는 경우 올림 처리하여 요금 누적한다.

⇒ 누적된 요금을 answer에 세팅해서 반환해주면 정답이 된다.

💚 제출 코드

import java.util.*;
class Solution {
    //시간 -> 분으로 교체
    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<String, Integer > map = new HashMap<>(); 
            
        for(String info : records){
            String time = info.split(" ")[0];
            String carNum = info.split(" ")[1];
            String inOut = info.split(" ")[2];
            
            int mTime = getTime(time); //분
            if(inOut.equals("IN")){ //입차 기록 
                map.put(carNum, map.getOrDefault(carNum, 0) - mTime); //음수로
            }else{ //출차 기록 
                map.put(carNum, map.getOrDefault(carNum, 0) + mTime); //양수로
            }
        }
        
        //빠져나온 상태에서 음수나 0으로 존재하는 경우는 출차기록이 없는 거임 출차 처리
        for(String car : map.keySet()){
            if(map.get(car) <= 0){
                int m = map.get(car);
                m += getTime("23:59");
                map.put(car, m);
            }
        }
        
        //이제 요금 계산하기 
        List<Integer> answer = new ArrayList<>();
        List<String> keySet = new ArrayList<>(map.keySet());
        Collections.sort(keySet);
        
        for(String car : keySet){
            //기본요금 0원이 아니면서, 
            if(fees[1] != 0 && map.get(car) != 0 && map.get(car) <= fees[0]) { //기본요금 이하면 
                answer.add(fees[1]);
            }else{
                int base = map.get(car) - fees[0];//기본요금 빼고
                int dan = base / fees[2];
                if(base % fees[2] != 0){//나눠떨어지면
                    dan += 1;
                }
                
                int price = fees[1] + (dan * fees[3]);
                answer.add(price);
            }
            
        }
        
        
        return answer;
    }
}

💚 회고 & 시간복잡도

풀었던 문제를 다시 풀게 됐다. HashMap 활용해서 차량 식별하고, 입/출차 별로 누적 시간을 세팅해줬던 문제였다. 25분 정도 걸린 듯 하다.

 

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

⬛ 프로그래머스(카카오 기출) | LV.2 주차 요금 계산 - 단순 구현 문풀 https://school.programmers.co.kr/learn/courses/30/lessons/92341 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그

ccclean.tistory.com

for문을 1번씩 순회하면서 처리했다. 순회 대상인 records 길이는 최대 1000 이고, map에 담긴 차량 또한 records 길이를 넘어갈 수 없기 때문에 각 대상에 대한 1번씩의 for문 처리는 크게 시간초과를 염려할 정도는 아니라고 판단했고, 구현만 제대로 한다면 시간초과 걱정없이 제대로 동작했다.

728x90