[프로그래머스] 주차 요금 계산 (JAVA)

개츠비·2023년 3월 2일
0

프로그래머스

목록 보기
2/16
post-custom-banner

소요시간

총 소요시간은 53분 .
문제 이해하는 데에 10분
(다 읽기에는 문제가 진짜 너무 길었다. 대략적으로 훑어보고 우선 코딩한 후 제출하여서 나중에 실패가 뜨면 그 떄 찾아보기로 함.. 다행히 내가 생각한 것 외에는 오류 안났음 !)

어떤 알고리즘 쓸까 생각하고 시간복잡도 계산하는데에 5분
나머지 시간은 구현하는데에 사용.

이번 문제는 예외 처리해줄게 IN 으로 들어갔는데 OUT으로 나오지 않았다면 그 차는 23:59에 나온 것으로 간주한다는 것이다.

문제 해결 과정

가장 크게 고민한 문제 : 시간을 어떻게 더해주고 빼주냐는 것이다. 예를 들어 08:40 - 06:20 이라고 하면 시간 따로, 분 따로 빼줘서 02:20이 나온다. 하지만 08:40 - 05:50 이라면?? 이 경우에 어떻게 빼줘야 할지 많이 고민했다. 그리고 내린 결론은 시간에 60을 곱해줘서 분으로 환산한 후 계산하는 것이다.

  1. 시간, 분을 나누고 시간*60을 분에 더해줌.
  2. 만약 HashMap에 차량 번호가 없다면 IN으로 간주. 없다면 OUT 으로 간주 해서 map 에 넣음. (map 의 key 는 차량번호, value는 몇분인지 나타냄 )
  3. 만약 for문이 끝났는데 map 이 비지 않았다면 23:59에 나간것으로 간주함. 23:59를 분으로 환산하면 1439 이므로 1439 - map에 남아있던 value가 분이 될 것임.
  4. 2-3 번 과정에서 OUT처리 된것은 count라는 해시맵에 또 값을 넣어서 갱신시켜줌.
  5. count 해시맵의 key는 차량번호고, value는 총 몇분인지인데, 차량번호 순서대로 정렬하기 위해 arr라는 2차원 배열에 값을 넣고 차량 번호순으로 오름차순 정렬함
  6. 이제 오름차순 정렬된 차량번호 순서대로 가격표를 담을 result 배열을 만든다. 어찌 되었던 기본요금은 fees[1] 이므로 그렇게 초기화 하고, 넘은 시간만큼 요금을 더해준다. 이때 추가 된 시간이 단위시간 (fees[2]) 로 나누어 떨어는 것과 나누어 떨어지지 않는 경우를 구분한다.

소스코드

import java.util.*;
class Solution {
	public int[] solution(int[] fees, String[] records) {

		HashMap<Integer,Integer> map=new HashMap<>();    
		HashMap<Integer,Integer> cost=new HashMap<>();
		for(int i=0;i<records.length;i++){ 
			String line[]=records[i].split(" ");
			String time[]=line[0].split(":"); 
			int carNum=Integer.parseInt(line[1]);

			int hour=Integer.parseInt(time[0]);
			int minute=Integer.parseInt(time[1]);
			minute+=(hour*60);

			if(map.containsKey(carNum)==false)
				map.put(carNum,minute);
			else{
				Integer prevMinute=map.remove(carNum);
				int price=minute-prevMinute;
				if(cost.containsKey(carNum)==false)
					cost.put(carNum,price);
				else
					cost.replace(carNum,cost.get(carNum)+price);

			}


		}
		for(int carNum:map.keySet()){
			int prevPrice=map.get(carNum);
			int nowPrice=1439;
			int price=nowPrice-prevPrice;
			if(cost.containsKey(carNum)==false)
				cost.put(carNum,price);
			else
				cost.replace(carNum,cost.get(carNum)+price);

		}
		int arr[][]=new int[cost.size()][2];
		int index=0;

		for(int i:cost.keySet()){
			arr[index][0]=i;
			arr[index][1]=cost.get(i);
			index++;
		}
		Arrays.sort(arr,new Comparator<>(){
			@Override
			public int compare(int n1[],int n2[]){
				if(n1[0]>n2[0])
					return 1;
				return -1;
			}
		});

		int result[]=new int[arr.length];
		for(int i=0;i<arr.length;i++){
			result[i]=fees[1];
			int overTime=arr[i][1]-fees[0];
			if(overTime>0){
				System.out.print(overTime+" ");
				int cul=overTime%fees[2];
				int m=overTime/fees[2];
				if(cul!=0) m++; 
				result[i]+=(m*fees[3]);
			}

		}



		return result;
	}
}

회고

시간의 덧셈, 뺄셈 부분에서 좀 약한 것 같다. 나머지(%) 연산을 이용해서 시간의 덧셈 뺄셈을 하는 방법을 알아두어야 겠다. 53분이 걸렸는데 시간을 더 줄일수 있도록 해봐야 겠다.

https://solved.ac/profile/anwlro0212
하루에 백준 1문제 이상 풀기.

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람
post-custom-banner

0개의 댓글