[문제 링크]
https://school.programmers.co.kr/learn/courses/30/lessons/92341
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
[코드]
import java.util.*;
class Solution {
public int[] solution(int[] fees, String[] records) {
// 기본 시간, 요금, 단위 시간, 단위 요금
int basicTime = fees[0];
int basicCharge = fees[1];
int partTime = fees[2];
int partCharge = fees[3];
// 차량 입차 시간 기록
Map<String, String> carInMap = new HashMap<>();
// 차량별 누적 시간
Map<String, Integer> carTimeMap = new HashMap<>();
for (String record : records) {
String[] split = record.split(" ");
String time = split[0];
String carNumber = split[1];
String inOrOut = split[2];
if (inOrOut.equals("IN")) {
carInMap.put(carNumber, time);
} else { // OUT
String inTime = carInMap.remove(carNumber);
int minutes = getTotalMinute(inTime, time);
carTimeMap.put(carNumber, carTimeMap.getOrDefault(carNumber, 0) + minutes);
}
}
// 출차 기록 없는 차량 처리 (23:59 기준)
for (String carNumber : carInMap.keySet()) {
String inTime = carInMap.get(carNumber);
int minutes = getTotalMinute(inTime, "23:59");
carTimeMap.put(carNumber, carTimeMap.getOrDefault(carNumber, 0) + minutes);
}
// 차량 번호 정렬
List<String> carNumbers = new ArrayList<>(carTimeMap.keySet());
Collections.sort(carNumbers);
// 최종 요금 계산
int[] answer = new int[carNumbers.size()];
for (int i = 0; i < carNumbers.size(); i++) {
int totalTime = carTimeMap.get(carNumbers.get(i));
answer[i] = getTotalCharge(totalTime, basicTime, basicCharge, partTime, partCharge);
}
return answer;
}
// "HH:MM" 형식 문자열을 분 단위로 변환 후 차이 계산
private int getTotalMinute(String in, String out) {
String[] inArr = in.split(":");
String[] outArr = out.split(":");
int inHour = Integer.parseInt(inArr[0]);
int inMinute = Integer.parseInt(inArr[1]);
int outHour = Integer.parseInt(outArr[0]);
int outMinute = Integer.parseInt(outArr[1]);
return (outHour * 60 + outMinute) - (inHour * 60 + inMinute);
}
// 최종 요금 계산
private int getTotalCharge(int totalTime, int basicTime, int basicCharge, int partTime, int partCharge) {
if (totalTime <= basicTime) return basicCharge;
int extraTime = totalTime - basicTime;
int extraCharge = 0;
if(extraTime % partTime == 0) {
extraCharge += (extraTime / partTime) * partCharge;
} else {
extraCharge += ((extraTime / partTime) + 1) * partCharge;
}
return basicCharge + extraCharge;
}
}
[회고]
풀이 과정은 쉬웠지만 생각보다 구현하는데 많은 시간이 걸렸고 좀 헷갈렸습니다.
쉬운 카카오 공채 문제였지만 그래도 해결해서 좋습니다.
질문과 피드백은 언제나 환영입니다.
감사합니다.
'CodingTest > Programmers' 카테고리의 다른 글
| [Programmers] 파괴되지 않은 건물 (카카오 2022 공채) (2) | 2025.09.24 |
|---|---|
| [Programmers] 양과 늑대 (카카오 2022 공채) (2) | 2025.09.16 |
| [Programmers] k진수에서 소수 개수 구하기 (카카오 2022 공채) (0) | 2025.09.09 |
| [Programmers] 신고 결과 받기 (카카오 2022 공채) (0) | 2025.09.08 |
| [Programmers] 섬 연결하기 (3) | 2025.07.31 |