요르딩딩

프로그래머스 : 주차 요금 계산 본문

[코딩테스트]/문제풀이

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

요르딩딩 2022. 4. 12. 13:38
728x90
반응형

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. map에 key기준 오름차순으로 정렬해주는 TreeMap

2. map에 누적값을 넣을때 사용하면 좋은 map.getOrDefault()

3. list<Integer> -> int[] 변환하는 list.stream().mapToInt(i -> i).toArray();

 

또한 이 문제에서 시간, 분을 계산할때는 모두 분으로 만든 후 출차 - 입차를 하면 주차한 시간을 구할 수 있다.

 

구현하는데는 큰 문제는 없었다. 다만 풀이 시간이 더 적게 걸릴 수 있도록 노력해야겠다.

import java.util.*;

class Solution {
	@SuppressWarnings("unchecked")
	public int[] solution(int[] fees, String[] records) {
		int[] answer = {};
		
		ArrayList<Integer> answerList = new ArrayList<Integer>();

		HashMap<String, Object> map = new HashMap<String, Object>();
		TreeMap<String, Object> mapTime = new TreeMap<String, Object>(); //트리맵 키 순으로 정렬 *****

		for (String r : records) {
			String[] tmpArr = r.split(" ");
			String time = tmpArr[0];
			String carNum = tmpArr[1];

			if (!map.containsKey(carNum)) {
				map.put(carNum, new ArrayList<String>());// 시간배열 선언
				mapTime.put(carNum, 0); 
			}
			((ArrayList<String>) map.get(carNum)).add(time); // 시간 넣어주기
		}

		for (String k : map.keySet()) {
			ArrayList<String> timeList = (ArrayList<String>) map.get(k);

			for (int i = 0; i < timeList.size(); i += 2) { // 2씩증가
				String inTime = "";
				String outTime = "";
				if (i == timeList.size() - 1) { // 마지막 out 없을 경우
					inTime = timeList.get(i);
					outTime = "23:59"; // 23:59
				} else {
					inTime = timeList.get(i);
					outTime = timeList.get(i + 1);
				}

				String[] inTimeArr = inTime.split(":");
				String[] outTimeArr = outTime.split(":");

				int inHour = Integer.parseInt(inTimeArr[0]);
				int outHour = Integer.parseInt(outTimeArr[0]);

				int inMin = Integer.parseInt(inTimeArr[1]);
				int outMin = Integer.parseInt(outTimeArr[1]);

				int totTime = ((outHour * 60) + outMin) - ((inHour * 60) + inMin); //(출자시간*60 +출차분) - (입차시간*60 + 입차분) 
				
				mapTime.put(k, (int)mapTime.getOrDefault(k, 0) + totTime); // 누적시간****
			}
		}
		
		for(String mt : mapTime.keySet()) {
			int totTime =  (int) mapTime.get(mt);
			
			int calMoney=0;
			if(totTime < fees[0]) {
				calMoney = fees[1];
			}else {
				calMoney = (int) (fees[1] + Math.ceil(((double)totTime - fees[0]) / fees[2]) * fees[3]);	
			}
			answerList.add(calMoney);
		}

		answer =answerList.stream().mapToInt(i -> i).toArray(); // List<integer> -> int[]로 변환*****
		
		return answer;
	}
}
728x90
반응형
Comments