알고리즘/알고리즘문풀

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

developer-ellen 2022. 6. 15. 00:05

 문제 - 2022 KAKAO BLIND RECRUITMENT 주차 요금 계산 - JAVA 풀이법

출처 

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

 

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

[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

 

 

📝 문제해결법 

1. HashMap + 구현을 통해 문제를 해결하였다.

  • inout이라는 HashMap을 통해 Key(차넘버), Value(Park객체 -> time(총 주차한 시간), in_time(차가 주차장에 들어온 시간), isOut(차가 혹시 주차장을 나갔는지체크))로 관리한다.
  • car라는 ArrayList로 차넘버에 대한 정보를 넣고 나중에 answer에 차번호를 오름차순으로 주차비용을 넣기위해 활용한다.
  • str_to_time()이라는 메서드를 통해 hh:mm 상태를 -> 분단위로 바꿔준다.
  • 주차장에 기록을 차례대로 만약 해당 차가 들어온 상태(IN)일 때 만약 처음 들어오는 차인지 아닌지 hashMap에 해당 차번호로 키값이 존재하는지 여부를 체크한다.
  • 처음으로 들어온 차라면 hashMap에 해당 차번호로 생성 및 car에 차번호를 넣어준다.
  • 차가 주차장에 들어옴 처리를 위해 isOut(차가 주차장을 나갔는지 체크)를 false로 변경해주고 차가 들어온 시간을 Park 객체에 변경해준다.
  • 만약 차가 나가는 상태(OUT)이라면 차가 들어온 시간 in_time과 나간 시간 out_time을 빼서 기존 hashMap time(누적 주차 시간)에 더해준다.
  • car라는 리스트를 정렬하면 오름차순으로 차의 번호대로 누적 주차 시간마다  cal_money 함수를 호출하여서 주차 요금을 계산한다.
  • cal_money() 함수에는 문제에서 주어진 그대로 누적 주차 시간(time)이 기본시간 이하라면 기본요금으로, 누적 주차시간이 기본시간 초과라면 단위시간마다 단위요금을 곱해주고 기본요금을 더해서 주차요금을 리턴한다.

 

2. 느낀점

  • 이 문제 코드는 정말 맘에 들지 않는다.. 그래도 두 차례정도 코드를 손봤는데 다른 사람들이 푼 코드를 보면 조금 더 간결하게 푸셨다.. 부럽..
  • 처음에 문제를 체계적으로 설계한 상태에서 프로그래머스에 웹상에서 바로 코딩해서 시간이 많이 걸렸다.. 다음부터 문제를 제대로 읽고 체계적으로 설계하고 한번 테스트 케이스로 검증후에 코드를 작성해야하겠다!
  • 일단 이 문제를 푸면서 느낀 점은 ArrayList를 정렬할 때 Collections.sort를 활용하는데 이 때 String 형태는 정렬을 위해 다른 처리를 해줘야하는줄 알았는데 숫자형 String이라면 숫자처럼 정렬을 해준다는 사실이다!
  • 조금은 객체지향스럽게 코드를 작성해봤는데 이게 과연 코테에서도 좋은 코드인지는 아직까지 의문이다.. 아시는 분 있다면 댓글주세요...ㅎㅎ

 

 

💻 소스코드 

// 2022 KAKAO BLIND RECRUITMENT - 주차 요금 계산
// HashMap + 구현
import java.util.*;

class Solution {
    public static class Park {
		int time = 0;
        int in_time = -1;
        boolean isOut = false;
	}
    
    public int[] solution(int[] fees, String[] records) {
        
         ArrayList<String> car = new ArrayList<String>();
	        HashMap<String, Park> inout = new HashMap<String, Park>();

	        for(int i=0;i<records.length;i++){
	            String[] str = records[i].split(" ");
	            if(str[2].equals("IN")){
	                Park park;
	                int time = str_to_time(str[0]);
	                if(inout.containsKey(str[1])){
	                    park = inout.get(str[1]);
	                } else {
	                    car.add(str[1]);
	                    park = new Park();
	                }
	                park.in_time = time;
	                park.isOut = false;
	                inout.put(str[1], park);
	            } else {
	                int out_time = str_to_time(str[0]);
	                Park park = inout.get(str[1]);
	                int diff = out_time - park.in_time;
	                park.time += diff; 
	                park.isOut = true;
	            }
	        }
	        	int[] answer = new int[car.size()];
	            Collections.sort(car);
	            
	
	            for(int i=0;i<car.size();i++){
	            	String car_num = car.get(i);
	                if(inout.get(car_num).isOut){
	                	answer[i] = cal_money(inout.get(car_num).time, fees);
	                } else {
	                    int in_time = inout.get(car_num).in_time;
	                    int out_time = str_to_time("23:59");
	                    answer[i] = cal_money(inout.get(car_num).time + out_time-in_time, fees);
	                }
	                System.out.println(answer[i]);
	            }
	        
	    
	        

	        return answer;
	    }
	    
	    public static int cal_money(int diff, int[] fees){
	        int money = 0;
	        if(diff > fees[0]){
	            int diff_default = diff - fees[0];
	            if(diff_default % fees[2] == 0){
	                return fees[1] + (diff_default / fees[2]) * fees[3];
	            } else {
	                return fees[1] + ((diff_default / fees[2])+1) * fees[3];
	            }
	        } else {
	            return fees[1];
	        }
	    }
	    
	    public static int str_to_time(String t){
	        String[] str = t.split(":");
	        return Integer.parseInt(str[0]) * 60 + Integer.parseInt(str[1]);
	    }
}