https://programmers.co.kr/learn/courses/30/lessons/92341?language=java#
<개념>
- hashmap 정렬 (문자열 사전순으로 키 정렬)
- Map<String, Integer> sortedmap = new TreeMap<>(map);
- 문자열→숫자
- Integer.parseInt(str)
- Integer.valueOf(str)
- parseInt() 와 가장 큰 차이점은, valueOf() 메소드는 문자열을 변환하여 Integer Object를 리턴
- parseInt() 메소드는 primitive type인 int를 리턴
- int intValue1 = Integer.valueOf(str1).intValue();
<풀이>
- 누적주차시간 계산
- 나간 시간 - 들어온 시간
- 여러번 있을 경우 or 들어온 시간만있는 경우 어떻게 할 것인가
- hashmap에 차번호로 값을 저장할거?
- 주차요금 계산
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
- 생각할 것
- 입차 후 출차가 없는 차량은 따로 23:59에서 입차시간을 빼줘야함.
- 입차 출차 1번씩 하고 그 뒤에 또 들어온 차량은 누적해서 시간을 계산해야함.
- parking : 입차한 차들 기록 관리(차량번호, 입차시간(분)) =현재 주차중인 차
- fee : 출차한 차들 기록 관리 (차량번호,차량의 총 주차 시간(분))
- 출차하며 parking에서 해당 차량 제거하여 문제1 해결
- 총 주차시간 누적하여 더할 수 있어 문제2 해결
import java.util.*;
//1. 누적주차시간 계산(분으로)
//2. 주차요금 계산
public class 주차요금계산 {
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(n, n2));
}
public static int[] solution(int[] fees, String[] records) {
int[] answer; // 차량번호가 작은 자동차부터 주차요금을 정수 배열에 담아 return
//입력값으로부터 주차한 차들 정보가진 리스트 parking
HashMap<String, Integer> parking = new HashMap<>(); // Integer[]
//나간 차들 요금 계산 위해 ( 한번 들어온차말고 추후에 또 들어왔을때 한꺼번에 합쳐서 요금 청구 위해)
//PriorityQueue<car> fee = new PriorityQueue<>();
//pq는 자동 정렬은 되지만 있는지 확인하고 빼는게 힘들어
HashMap<String, Integer> fee = new HashMap<>(); // Integer[]
for (String r : records) { // "05:34 5961 IN"
String[] record = r.split(" "); // 띄어쓰기 기준으로 항목별로 배열에 넣음
int t = getMin(record[0]); // 시간
String n = record[1]; // 차량번호
String io = record[2]; //출입
// IN 이면
if(io.equals("IN")) {
//차량번호를 key로 하고, value는 들어온 시간을 분으로 바꾼 것.
parking.put(n, t);
// OUT 이면
}else {
if(!fee.containsKey(n)) { //이미 한번 들어왔던 차가 아니라면
fee.put(n, t - parking.get(n)); // 요금 청구할 시간 저장
}else { // 한번입출차하여 누적시간이 있다면
fee.put(n, fee.get(n) + t - parking.get(n)); //기존 시간에 추가해서 더하기
}
parking.remove(n);
}
}
//parking에 남아있는 출차하지 않은 차 요금 계산하기
for (String key : parking.keySet()) { //key = 차량번호
if(!fee.containsKey(key)) {
fee.put(key, (23*60+59)-parking.get(key));
}else {
fee.put(key, (23*60+59)-parking.get(key)+fee.get(key));
}
}
//fee 차량번호순으로 정렬하기
Map<String, Integer> sortedFee = new TreeMap<>(fee);
//fee에 저장되어있는 것들 요금 계산해서 출력하기
//fees[기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)]
answer = new int[fee.size()];
int i = 0;
for (String car : sortedFee.keySet()) { //key = 차량번호
int min = sortedFee.get(car);
//요금 = 기본요금 + ((min-기본시간)/단위시간) *단위요금
if(min<=fees[0]) {
answer[i++] = fees[1];
System.out.println(i+ " "+car+ "요금 : "+ fees[1]);
}else {
answer[i++] = (int) (fees[1] + Math.ceil((double)(min-fees[0])/fees[2])*fees[3]) ;
System.out.println(i+ " "+car+ "요금 : "+ (int) (fees[1] + Math.ceil((double)(min-fees[0])/fees[2])*fees[3]) );
}
}
return answer;
}
public static int getMin(String time) { // "05:34" 형태의 문자열을 int형 분으로 변환.
String[] t = time.split(":");
return Integer.parseInt(t[0])*60 + Integer.parseInt(t[1]);
}
}
github 링크
참고
'공부 > 알고리즘' 카테고리의 다른 글
[백준]2751_수 정렬하기2_Java풀이(Collections.sort, Counting Sort) (0) | 2023.01.10 |
---|---|
[프로그래머스]43162_네트워크_JAVA 풀이_DFS (0) | 2022.11.30 |
[백준]9095_1,2,3 더하기_JAVA 풀이 (0) | 2022.03.04 |
[정올]1681_해밀턴 순환회로_Java_ DFS + 백트래킹 (0) | 2022.02.25 |
[백준]2563_색종이_Java 풀이 (0) | 2022.02.11 |
댓글