728x90
반응형
https://github.com/ROUTINE-STUDY/Algorithm
알고리즘 스터디를 진행하고 있습니다. 😊
초보들로 구성되어있으며, 열심히 풀어보고 풀이 방식을 공유하고 피드백을 해주는 스터디입니다.
참여 문의는 댓글 혹은 GitHub 주소를 참고해주세요.
문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/92341
풀이 방법
1. 출입기록을 책임지는 클래스 설계
2. Map을 Key를 활용하여 여러 번 출입하는 기록 제어
내 코드(JAVA)
class Bill {
private List<LocalTime> inTimeList = new ArrayList<>();
private List<LocalTime> outTimeList = new ArrayList<>();
private double price;
private final double DEFAULT_MINUTE;
private final double DEFAULT_PRICE;
private final double UNIT_MINUTE;
private final double UNIT_PRICE;
public Bill(String record, int[] fees) {
DEFAULT_MINUTE = fees[0];
DEFAULT_PRICE = fees[1];
UNIT_MINUTE = fees[2];
UNIT_PRICE = fees[3];
addAccessRecords(record);
}
public void addAccessRecords(String record) { // 기록 저장
String[] info = record.split(" ");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("H:mm");
String recordTime = info[0];
if ("IN".equals(info[2])) {
inTimeList.add(LocalTime.parse(recordTime, dateTimeFormatter));
} else {
outTimeList.add(LocalTime.parse(recordTime, dateTimeFormatter));
}
}
public void calcPrice(int[] fees) { // 요금 계산
int totalMinute = 0;
for (int i = 0; i < inTimeList.size(); i++) {
LocalTime inTime = inTimeList.get(i);
LocalTime outTime;
try {
outTime = outTimeList.get(i);
} catch (IndexOutOfBoundsException e) {
outTime = LocalTime.of(23, 59);
}
totalMinute += Duration.between(inTime, outTime).getSeconds() / 60;
}
price = totalMinute > DEFAULT_MINUTE ? DEFAULT_PRICE + Math.ceil((totalMinute - DEFAULT_MINUTE) / UNIT_MINUTE) * UNIT_PRICE : DEFAULT_PRICE;
}
public double getPrice() {
return price;
}
}
public int[] solution(int[] fees, String[] records) {
int[] answer = {};
HashMap<String, Bill> billsMap = new HashMap<>();
for (String record : records) { // 기록 저장
String[] info = record.split(" ");
String carNumber = info[1];
Bill bill = billsMap.get(carNumber);
if (bill == null) {
billsMap.put(carNumber, new Bill(record, fees));
} else {
bill.addAccessRecords(record);
}
}
for (Bill bill : billsMap.values()) { // 요금 계산
bill.calcPrice(fees);
}
// 차 번호로 정렬 후 결과 세팅
ArrayList<String> keySet = new ArrayList<>(billsMap.keySet());
answer = new int[keySet.size()];
Collections.sort(keySet);
for (int i = 0; i < keySet.size(); i++) {
answer[i] = (int) billsMap.get(keySet.get(i)).getPrice();
}
return answer;
}
728x90
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스/JAVA] 개인정보 수집 유효기간 (0) | 2023.08.04 |
---|---|
[프로그래머스/JAVA] 야간 전술보행 (0) | 2022.11.14 |
[프로그래머스/JAVA] 성격 유형 검사하기 (0) | 2022.10.02 |
[백준/JAVA] 1978. 소수 찾기 (0) | 2022.07.16 |
[백준/JAVA] 2581. 소수 (0) | 2022.07.16 |
댓글