본문 바로가기
[ 다먹살 ]/- Coding

[프로그래머스] 레벨2 주차 요금 계산

by 엉망으로살기 2022. 4. 3.
반응형

https://programmers.co.kr/learn/courses/30/lessons/92341?language=java 

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]

programmers.co.kr

 

이 문제는 2022년 카카오 공채에 나온 문제라고 한다.  TreeMap이라는 자료구조를 처음 사용해봤는데 문제에 따라서 굉장히 유용하게 사용할 수 있을 것 같다. 문제는 아래의 처리과정을 통해 풀었다.

 

1. 사용할 HashMap, TreeMap, 변수 및 시간 차/요금계산용 static 메소드 구현

2. records의 값에 따라 입차/출차될 때를 나눠서 임시변수 HashMap에 저장

   1-1. 입차될 때에는 무조건 key-value(차 번호, 입차시간) 쌍을 저장

   1-2. 출차될 때에는 기존의 차 번호 key값을 기준으로 입차시간을 가져오기

     1-2-1. HashMap에서 입차시간을 가지고 있는 값을 제거

     1-2-2. 처음 출차되는 차는 출차시간-입차시간 결과를 그대로 결과값 TreeMap에 key-value(차 번호, 주차시간) 쌍으로 저장

     1-2-3. 이미 출차된 차는 TreeMap에 값이 있으므로, 기존의 주차시간 value + 출차될 때 계산된 새로운 주차시간을 더해서 key-value(차 번호, 주차시간) 쌍으로 저장

3. 출차가 안된 차량이 있을 경우에 예외처리

   2-1. HashMap에 값이 남아있는 경우 아직 출차가 안된 차이기 때문에 23시 59분을 기준으로 시간과 요금 계산

   2-2. 이 때, 윗 단계에서 출차가 안된 차일 경우에는 새롭게 TreeMap에 저장하고, 아닐 경우에는 기존의 value값과 더해서 key-value(차 번호, 주차시간) 쌍으로 저장

4. TreeMap 구조를 사용했기 때문에 key인 차량번호 기준으로 자동 오름차순이 되어있기 때문에 결과변수 int 배열에 result의 value값들을 저장한 후 리턴


문제


제한사항


입출력 예시


코드

import java.util.HashMap;
import java.util.TreeMap;

class Solution
{
     public static int calcCharge(int minute, int[] fees)
     {
         double result = 0;

         if(minute<fees[0])
         {
              return fees[1];
         }

         result = Math.ceil((double)(minute-fees[0])/fees[2]);
         return (int) (result*fees[3]) + fees[1];
     }
     public static int calcTime(int beforeH, int beforeM, int afterH, int afterM)
     {
         int hour = afterH-beforeH;
         int minute = (afterM-beforeM) + 60;

         if(minute<60)
         {
              hour--;
         }
         else
         {
              minute -= 60;
         }

         return (hour*60) + minute;
     }
     public static int[] solution(int[] fees, String[] records)
     {
         HashMap<String, String> map = new HashMap<String, String>(); // key(car), value(in time)
         TreeMap<String, Integer> result = new TreeMap<String, Integer>(); // key(car), value(minute)
         int calcTime = 0;
        
         for(int i=0; i<records.length; i++)
         {
              String[] input = records[i].split(" ");
        
              if(input[2].equals("IN")) // 입차될 때
              {
                   map.put(input[1], input[0]);
              }
              else // 출차될 때
              {
                   String[] before = map.get(input[1]).split(":");
                   String[] after = input[0].split(":");
                                             calcTime = calcTime(Integer.parseInt(before[0]), Integer.parseInt(before[1]), Integer.parseInt(after[0]), Integer.parseInt(after[1]));
                   map.remove(input[1]);
        
                   if(result.containsKey(input[1])) // 기존에 이미 출차된 차일때
                   {
                        result.put(input[1], result.get(input[1])+calcTime);
                   }
                   else // 처음 출차될 때
                   {
                        result.put(input[1], calcTime);
                   }
              }
         }
        
         // 출차가 안된 차량이 있을 경우 나머지 계산처리
         Object[] last = map.entrySet().toArray(new Object[0]);
        
         for(int i=0; i<last.length; i++)
         {
              String[] temp = last[i].toString().split("=");
              String[] time = temp[1].split(":");
              calcTime = calcTime(Integer.parseInt(time[0]), Integer.parseInt(time[1]), 23, 59);
            
              // 이미 결과 Map에 들어가있을 경우
              if(result.containsKey(temp[0]))
              {
                   result.put(temp[0], result.get(temp[0]) + calcTime);
              }
              // 차량이 결과 Map에 안들어가 있고, 출차되지 않을 경우(예외처리)
              else
              {
                   result.put(temp[0], calcTime);
              }
         }
        
         Integer[] time = result.values().toArray(new Integer[0]);
         int[] answer = new int[time.length];
        
         for(int i=0; i<time.length; i++)
         {
              answer[i] = calcCharge(time[i], fees);
         }
        
         return answer;
    }
}

 

반응형

'[ 다먹살 ] > - Coding' 카테고리의 다른 글

[백준] 14494 다이나믹이 뭐예요?  (0) 2022.04.05
[백준] 17413 단어 뒤집기2  (0) 2022.04.04
[프로그래머스] 레벨1 신고 결과 받기  (0) 2022.04.02
[백준] 1531 투명  (0) 2022.03.31
[백준] 11441 합 구하기  (0) 2022.03.29

댓글