🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/92341
😮 문제 해결 방법
Map을 이용해서 자동차 번호별 자동차의 정보를 저장한다.
자동차는 차량번호, 주차시간 (주차장 이용시간), 입차 시간, 입/출차 상태를 갖도록 클래스를 만들었다.
먼저 record배열을 하나씩 보면서 자동차의 정보를 Map으로 관리한다.
자동차가 처음으로 입차하는 경우는 containsKey를 이용해 판단하고, 주차시간을 0으로 하고, 입/출차 상태를 false로 넣어준다.
자동차가 출차되는 경우는 출차 시간에서 입차 시간을 빼서 주차시간을 갱신한다.
자동차가 다시 입차되는 경우는 입차 시간을 갱신한다.
모든 이력을 이용해 저장했다면, Map정보를 이용해 이용 요금을 계산한다.
자동차 번호가 낮은순으로 정렬해서 정답을 반환해야하므로, Map의 키셋을 정렬한 후 이용요금을 계산한다.
마지막으로 입차하고 출차가 안된 경우가 있기 때문에 입/출차 상태가 false인 경우에 23:59분에서 마지막 입차시간을 빼서 주차장 이용시간에 더해준다.
- 차량번호, 주차시간, 입차시간, 입/출차 상태를 갖는 클래스를 생성한다.
- record 배열을 하나씩 반복하면서 Map에 자동차가 주차장 이용한 정보를 갱신한다.
- 자동차가 처음 입차되는 경우 : 주차시간 0, 입차시간, 입/출차 상태 false로 초기화
- 자동차가 출차되는 경우 : 주차시간만 갱신한다.
- 자동차가 다시 입차되는 경우 : 입차시간만 갱신한다.
- Map의 키가 차량번호 이기 때문에 차량번호로 오름차순 정렬을 한다.
- Map을 이용해 차량번호 별 요금을 계산한다.
- 출차가 안된 차가 있을수 있으므로, 입/출차 상태가 false인 경우 값을 주차시간을 23:59분에서 입차시간을 빼서 추가해준 후 요금을 계산한다.
🚩 Java 코드
package com.second.algorithm.programmers;
import java.util.*;
public class Solution_92341_주차_요금_계산 {
public static void main(String[] args) {
int[] fees = {180, 5000, 10, 600};
String[] records = {"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"};
int[] rst = solution(fees, records);
for (int x : rst) {
System.out.println("x = " + x);
}
}
private static int[] solution(int[] fees, String[] records) {
/* fees : 0 : 기본 시간(분), 1 : 기본 요금, 2 : 단위 시간(분), 3: 단위 요금 */
/* 기본 요금 + ((주차 시간 - 기본 시간) / 단위 시간 ) * 600 */
// 주차 기록 남기기
Map<String, Car> logs = new HashMap<>();
for (String record : records) {
// 변수 받기
StringTokenizer st = new StringTokenizer(record);
int timeInformation = convertMinute(st.nextToken());
String carNumber = st.nextToken();
String status = st.nextToken();
remainLogs(logs, timeInformation, carNumber, status);
}
// 주차 요금 계산하기
int defaultMinute = fees[0];
int defaultFee = fees[1];
int unitMinute = fees[2];
int unitFee = fees[3];
// 자동차 번호가 낮은순 정렬
List<String> carNumbers = new ArrayList<>(logs.keySet());
Collections.sort(carNumbers);
List<Integer> payments = new ArrayList<>();
for (String carNumber : carNumbers) {
final String END_TIME = "23:59";
Car car = logs.get(carNumber);
int parkingMinute = car.getParkingMinute();
// 주차장에서 입차상태인 경우 출차를 안했기 때문에 23:59에서 시간 계산을 해준다.
if(!car.isStatus())
parkingMinute += (convertMinute(END_TIME) - car.getEntranceTime());
// 주차 요금 계산
int fee = defaultFee + (int) Math.ceil((double) (parkingMinute - defaultMinute) / unitMinute) * unitFee;
// 주차 시간이 기본시간이하인 경우 기본 요금
if(parkingMinute <= defaultMinute) fee = defaultFee;
payments.add(fee);
}
return payments.stream().mapToInt(Integer::intValue).toArray();
}
private static void remainLogs(Map<String, Car> logs, int timeInformation, String carNumber, String status) {
// 주차장에 기록이 없는 경우 기록 남기기
if(!logs.containsKey(carNumber)) {
logs.put(carNumber, new Car(carNumber, 0, timeInformation, false));
}
// 주차장 기록이 있는 경우 출차 기록 판단
else {
// 입차
Car car = logs.get(carNumber);
if (status.equals("IN")) {
// 입차의 경우 입차 시간을 갱신한다.
logs.replace(carNumber, new Car(carNumber, car.getParkingMinute(), timeInformation, false));
}
// 출차
else {
// 출차의 경우 주차 시간을 갱신한다.
int parkingMinute = car.getParkingMinute() + (timeInformation - car.getEntranceTime());
logs.replace(carNumber, new Car(carNumber, parkingMinute, 0, true));
}
}
}
private static int convertMinute(String time) {
StringTokenizer st = new StringTokenizer(time, ":");
int hour = Integer.parseInt(st.nextToken());
int minute = Integer.parseInt(st.nextToken());
return hour * 60 + minute;
}
static class Car {
private String carNumber; // 차량번호
private int parkingMinute; // 주차시간
private int entranceTime; // 입차시간
private boolean status; // false : 입차 / true : 출차
public Car(String carNumber, int parkingMinute, int entranceTime, boolean status) {
this.carNumber = carNumber;
this.parkingMinute = parkingMinute;
this.entranceTime = entranceTime;
this.status = status;
}
public String getCarNumber() {
return carNumber;
}
public int getParkingMinute() {
return parkingMinute;
}
public int getEntranceTime() {
return entranceTime;
}
public boolean isStatus() {
return status;
}
}
}
반응형
'Algorithm > 구현, 시뮬레이션(Implementation)' 카테고리의 다른 글
[백준, Java] 21610번 : 마법사 상어와 비바라기 (0) | 2022.07.27 |
---|---|
[프로그래머스, Java] 방문 길이 (0) | 2022.07.10 |
[백준, Java] 12100번 : 2048(easy) (0) | 2022.04.28 |
[프로그래머스, Java] N^2 배열 자르기 (0) | 2022.04.27 |