알고리즘

프로그래머스 주차요금계산 자바

은세고화 2022. 3. 16. 00:22
반응형

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

 

생각한 방식

차 번호를 기반으로 조회하므로 자료구조는 맵으로 선택했다.

가장 작은 번호순으로 answer배열에 값을 넣고 출력해야 한다. records를 한 번 순회해야 차번호를 정렬할 수 있으므로 list에 차 번호를 넣어서 이 값을 인덱스로 활용했다.

 

분 배열을 만들어서 list에서 구한 인덱스에 분 값을 다 넣고 price배열에 가격을 계산한 값을 넣었다.

 

잘 한 부분

map을 고른 것과 list를 인덱스로 활용했다.

 

부족한 부분

문제를 잘못 이해해서 minutes배열을 구하지 않았었다. 

다른 코드를 참고하니 시간을 먼저 계산해서 넣었다. 미리 계산하면 for문을 한 번 줄일 수 있다.

또한 TreeMap에 차 번호를 넣고 index변수를 선언해서 순회하면 굳이 list를 새로 생성할 필요 없이 index를 조회할 수 있다.

 

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class Solution {
	
	public static void main(String[] args){
		int[] n = {180, 5000, 10, 600};
		String[] n2 = {"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"};
		
		//System.out.println(solution(4578, n));
		System.out.println(solution(n, n2));
	}
	
    public static int[] solution(int[] fees, String[] records){
        int[] answer;
        Map<String, String> map = new HashMap<String, String>();
        ArrayList<String> list = new ArrayList<>();
        
        for (String record : records) {
        	String[] item = record.split(" ");
			if(!list.contains(item[1])) list.add(item[1]);
		}
        Collections.sort(list);
        
        answer = new int[list.size()];
        int[] minutes = new int[list.size()];
        
        for (String record : records) {
			String[] item = record.split(" ");
			if(item[2].equals("IN")) {
				map.put(item[1], item[0]);
			}else {
				String[] inTimes = map.remove(item[1]).split(":");
				String[] outTimes = item[0].split(":");
				
				//분으로 변경
				int inTimeHour = Integer.parseInt(inTimes[0]) * 60;
				int outTimeHour = Integer.parseInt(outTimes[0]) * 60;
				//차를 구하고 요금을 계산함
				int minute = (outTimeHour + Integer.parseInt(outTimes[1])) - (inTimeHour + Integer.parseInt(inTimes[1]));

				minutes[list.indexOf(item[1])] += minute;
			}
		}
        
        for (String carNum : map.keySet()) {
			//남아있는 차 번호
        	int lastTime = 1439;
        	String[] inTimes = map.get(carNum).split(":");
        	int inTime = Integer.parseInt(inTimes[0]) * 60 + Integer.parseInt(inTimes[1]);
        	minutes[list.indexOf(carNum)] += lastTime - inTime;
		}
        
        for (int i = 0; i < minutes.length; i++) {
        	int price = 0;
        	if(minutes[i] <= fees[0]) price = fees[1];
        	else {
            	price = fees[1] + ((int)Math.ceil((double)(minutes[i] - fees[0]) / fees[2]) * fees[3]);
            }
        	answer[i] = price;
		}
        return answer;
    }
}

 

반응형