링크 : https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이
1. records를 차례대로 입력받으며
1.1 입차일 경우, map에 저장하고
1.2 출차일 경우, 누적시간을 계산해 calculateMap에 저장 + map에서는 삭제 해준다.
2. map에 남아있는 자동차가 있는 경우 출차를 하지 않은 차량이므로 23:59 출차를 했다고 가정하고 calculateMap에 마저 저장해준다.
3. calculateMap에 저장된 자동차들을 차례로 돌며 요금을 계산해준다.
* 차량 번호가 작은 자동차부터 정답을 출력해야 하므로 트리맵을 사용해준다.
-> 트리맵은 키 값에 따라 오름차순으로 자동 정렬이 됨
* 주차요금 계산 시 Math.ceil() 사용에 주의해야 한다.
-> 정수형끼리 계산하면 결과도 정수형으로 나옴! = 정수형끼리 계산하면 소수점이 버려짐
ex) Math.ceil(10/4)를 할 경우, 3이 나올 것이라고 생각하기 쉬우나 결과는 2가 나온다.
따라서 올림이 되려면 Math.ceil(10.0/4.0)으로 해야 결과가 3이 나온다.
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
Map<String, String> map = new HashMap<>(); // 배열 임시저장용
Map<String, Integer> calculateMap = new TreeMap<>(); // 차번호, 누적시간
for(int i=0; i<records.length; i++) {
String[] recordStr = records[i].split(" ");
String timeStr = recordStr[0]; // 시간
String carNum = recordStr[1]; // 차번호
String inOut = recordStr[2]; // 입차 or 출차 여부
if("OUT".equals(inOut)) {
int time = calculateTime(map.get(carNum), timeStr);
if(calculateMap.containsKey(carNum)) {
calculateMap.put(carNum, calculateMap.get(carNum) + time);
} else {
calculateMap.put(carNum, time);
}
map.remove(carNum);
} else if("IN".equals(inOut)) {
map.put(carNum, timeStr);
}
}
// map에 남아있는 차가 있다면 출차하지 않은 경우이므로 마저 계산
if(map.size() > 0) {
for(String carNum : map.keySet()) {
int time = calculateTime(map.get(carNum), "23:59");
if(calculateMap.containsKey(carNum)) {
calculateMap.put(carNum, calculateMap.get(carNum) + time);
} else {
calculateMap.put(carNum, time);
}
}
}
// 주차요금 계산
int[] answer = new int[calculateMap.size()];
int cnt = 0;
for(String carNum : calculateMap.keySet()) {
int pay = fees[1];
if(calculateMap.get(carNum) > fees[0]) {
pay += Math.ceil( (float) (calculateMap.get(carNum) - fees[0]) / fees[2]) * fees[3];
}
answer[cnt] = pay;
cnt++;
}
return answer;
}
// 입차 ~ 출차 까지의 시간 계산
// 05:34, 07:59 입력 시
// 차이가 02:25 이므로 60 * 2 + 25 = 145 리턴
private int calculateTime(String inTime, String outTime) {
int time = 0;
String[] orgnTime = inTime.split(":");
int orgnHour = Integer.parseInt(orgnTime[0]);
int orgnMin = Integer.parseInt(orgnTime[1]);
String[] newTime = outTime.split(":");
int newHour = Integer.parseInt(newTime[0]);
int newMin = Integer.parseInt(newTime[1]);
time = (newHour - orgnHour) * 60 + (newMin - orgnMin);
return time;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 디펜스 게임(Java) (3) | 2024.11.12 |
|---|---|
| [프로그래머스] 테이블 해시 함수(Java) (0) | 2024.11.07 |
| [프로그래머스] N개의 최소공배수(Java) (0) | 2024.10.31 |
| [프로그래머스] k진수에서 소수 개수 구하기 (4) | 2024.10.28 |
| [프로그래머스] 모음 사전(Java) (1) | 2024.10.26 |