주차 요금 계산(2022 KAKAO BLIND RECRUITMENT)

권 해·2023년 2월 18일

Algorithm

목록 보기
17/49

문제

코드

import java.util.*;

class Solution {
    public int[] solution(int[] fees, String[] records) {
        Map<String,String> parking=new HashMap<>();
        Map<String,Integer> result=new HashMap<>();
        for(String s:records){
            String[] record=s.split(" ");
            if(record[2].equals("IN"))
                parking.put(record[1],record[0]);
            else{
                if(result.containsKey(record[1]))
                    result.put(record[1],result.get(record[1])+calcTime(parking.get(record[1]),record[0]));
                else
                    result.put(record[1],calcTime(parking.get(record[1]),record[0]));
                parking.remove(record[1]);
            }    
        }
        for(String s:parking.keySet()){
            if(result.containsKey(s))
                result.put(s,result.get(s)+calcTime(parking.get(s),"23:59"));
            else    
                result.put(s,calcTime(parking.get(s),"23:59"));
        }

        ArrayList<String> sortedNum= new ArrayList<>(result.keySet());
        Collections.sort(sortedNum);
        int[] answer=new int[result.size()];
        for(int i=0; i<sortedNum.size();i++)
            answer[i]=calcFee(result.get(sortedNum.get(i)),fees);
        
        return answer;
    }                    
    
    public int calcTime(String in,String out){
        int start=60*Integer.parseInt(in.split(":")[0])+Integer.parseInt(in.split(":")[1]);
        int end=60*Integer.parseInt(out.split(":")[0])+Integer.parseInt(out.split(":")[1]);
        return end-start;
    }
   
   public int calcFee(int time,int[] fees){
       int fee=0;
       time-=fees[0];
       fee+=fees[1];
       
       if(time>0){
           if(time%fees[2]==0) fee+=fees[3]*(time/fees[2]);
           else fee+=fees[3]*(time/fees[2]+1);
       }
       return fee;
   }
                           
}

풀이

(1) records를 순회하며 "IN"이 들어온 경우에는 parking(HashMap)에 넣어주고, "OUT"이 들어온 경우에는 calcTime() 메소드를 호출하여 주차 시간을 계산한 뒤 result(HashMap)에 넣어준다.
-> 이 때, 두 번 이상 입,출차 한 차가 있을 수도 있으니 result에 차 번호가 이미 있는지 확인하여, 이미 기록이 있는 차의 주차시간은 누적계산 해주어야 한다.
-> 주차 시간이 완료된 차는 parking(HashMap)에서 제거해 준다.
(2) (1)이 끝난 뒤, parking에 남아있는 차에 대해 출차 시간을 "23:59"로 설정하여 주차시간을 계산해 준다.
(3) result.keySet()을 통해 ArrayList를 생성하여Collections.sort() 함수로 차 번호에 대해 오름차순 정렬 해준다.
(4) (3)에서 얻은 ArrayList의 요소를 순회하며 calcFee() 메소드를 통해 요금을 계산하고, answer 배열에 값을 넣어준다.

결과

과정이 살짝 귀찮긴 했지만, 큰 어려움이 없던 문제였다.
코드를 거의 다 짰을 때, 문제를 다시한번 읽으니 차 번호에 대해 오름차순으로 결과를 저장해야 한다는 것을 발견했다.
나는 HashMap 자료구조를 사용하여 코드를 짜고 있었기 때문에 어떻게 해야하나 고민하던 도중, ArrayList의 생성자에 Collection을 사용할 수 있다는 것이 떠올랐다.
그래서 ArrayList의 생성자에 result.keySet()을 넣어 생성해 준 뒤, Collections.sort() 함수로 차 번호에 대해 오름차순 정렬 할 수 있었다.

이런 문제는 코드를 짜기 전에 먼저 노트에 정리를 완벽하게 한 뒤 시작하는 것이 확실히 도움이 되는 것 같다.

출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges

0개의 댓글