1. 문제
https://school.programmers.co.kr/learn/courses/30/lessons/92341
2. 풀이 과정
HashMap에 <차_번호, int[] {입/출차기록, 총_시간}>을 기록한다.
- 입/출차 기록 : 입차할 때는 +1, 출차할 때는 -1을 해서 마지막에 요금을 계산할 때 1이면 23:59분으로 출차!
- 총_시간 : 입차할 때는 -minute, 출차할 때는 +minute으로 총 시간을 계산한다.
Key들을 정렬해서, 차례대로 가격을 계산해서 결과를 출력한다.
import java.util.*;
class Solution {
public int htom(String h){
String[] time = h.split(":");
return Integer.parseInt(time[0])*60 + Integer.parseInt(time[1]);
}
public int calculate(int[] fees, int[] status){
int result = 0;
if(status[0]>0){status[1]+=htom("23:59");}//출차
//기본 요금
status[1] = Math.max(0, status[1]-fees[0]);
result+=fees[1];
//단위 요금
result += (status[1]+fees[2]-1)/fees[2]*fees[3];
return result;
}
public int[] solution(int[] fees, String[] records) {
Map<String, int[]> cars = new HashMap<>();//입차+1, 출차-1 | 시간 합
StringTokenizer st = null;
for(String record : records){
st = new StringTokenizer(record);
int minute = htom(st.nextToken());
String carNum = st.nextToken();
int[] status;
switch(st.nextToken()){
case "IN":
status = cars.getOrDefault(carNum, new int[]{0, 0});
status[0]++;
status[1]-=minute;
cars.put(carNum, status);
break;
case "OUT":
status = cars.get(carNum);
status[0]--;
status[1]+=minute;
cars.put(carNum, status);
break;
}
}
Set<String> set = cars.keySet();
String[] numbers = set.toArray(new String[set.size()]);
Arrays.sort(numbers);
int[] answer = new int[set.size()];
int idx = 0;
for(String number : numbers){
answer[idx++] = calculate(fees, cars.get(number));
}
return answer;
}
}
Map, HashMap관련 메서드가 바로 생각나지 않았다..
또 집합을 문자열배열로 변환하는 과정은 거의 초면이라서 익숙해져야겠다!
'코딩문제풀이 > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 : 양궁대회 (0) | 2022.10.10 |
---|---|
[Java] 프로그래머스 : 불량 사용자* (0) | 2022.09.29 |
[Java] 프로그래머스 : 합승 택시 요금 (0) | 2022.09.24 |
[Java] 프로그래머스 : 등산코스 정하기 (0) | 2022.09.17 |
[Java] 프로그래머스 : 추석 트래픽 (0) | 2022.09.01 |