728x90
⬛ 프로그래머스 (카카오) | LV.2 주차 요금 계산 (RE) - 구현 문풀 (Java)
https://school.programmers.co.kr/learn/courses/30/lessons/92341
💚 문제 접근 방식
주의할 점은 입차는 있고, 출차는 없을 때 23:59 출차로 대체해야 하는 부분이다.
1) records[] 로 들어오는 배열 순회하며
- time은 getTime으로 분 시간 교환
- carNum 은 식별자로서 HashMap의 key에 세팅
- inOut은 입차/출차 정보 구분용으로 (입차는 음수 시간) (출차는 양수 시간) 세팅
2) 빠져나온 상황에서 입차 정보는 있고 출차 없는 차량은 필수적으로 0보다 작거나 같은 value를 가질 것이므로 23:59 에 해당하는 시간으로 누적합 처리해줌
3) 요금 계산 시 차량 번호 오름차순이므로 keySet에 key에 대한 정렬 List 처리
4) 정렬된 KeySet 순회하며 각 car에 대한 누적 시간이 기본 시간 이하인지 초과인지에 따라 요금 처리
- 기본 요금 초과의 경우, 나눠떨어지지 않는 경우 올림 처리하여 요금 누적한다.
⇒ 누적된 요금을 answer에 세팅해서 반환해주면 정답이 된다.
💚 제출 코드
import java.util.*;
class Solution {
//시간 -> 분으로 교체
private static int getTime(String time){
int H = Integer.parseInt(time.split(":")[0]);
int M = Integer.parseInt(time.split(":")[1]);
return 60 * H + M;
}
//솔루션 함수
public List<Integer> solution(int[] fees, String[] records) {
//차번호, 누적시간
Map<String, Integer > map = new HashMap<>();
for(String info : records){
String time = info.split(" ")[0];
String carNum = info.split(" ")[1];
String inOut = info.split(" ")[2];
int mTime = getTime(time); //분
if(inOut.equals("IN")){ //입차 기록
map.put(carNum, map.getOrDefault(carNum, 0) - mTime); //음수로
}else{ //출차 기록
map.put(carNum, map.getOrDefault(carNum, 0) + mTime); //양수로
}
}
//빠져나온 상태에서 음수나 0으로 존재하는 경우는 출차기록이 없는 거임 출차 처리
for(String car : map.keySet()){
if(map.get(car) <= 0){
int m = map.get(car);
m += getTime("23:59");
map.put(car, m);
}
}
//이제 요금 계산하기
List<Integer> answer = new ArrayList<>();
List<String> keySet = new ArrayList<>(map.keySet());
Collections.sort(keySet);
for(String car : keySet){
//기본요금 0원이 아니면서,
if(fees[1] != 0 && map.get(car) != 0 && map.get(car) <= fees[0]) { //기본요금 이하면
answer.add(fees[1]);
}else{
int base = map.get(car) - fees[0];//기본요금 빼고
int dan = base / fees[2];
if(base % fees[2] != 0){//나눠떨어지면
dan += 1;
}
int price = fees[1] + (dan * fees[3]);
answer.add(price);
}
}
return answer;
}
}
💚 회고 & 시간복잡도
풀었던 문제를 다시 풀게 됐다. HashMap 활용해서 차량 식별하고, 입/출차 별로 누적 시간을 세팅해줬던 문제였다. 25분 정도 걸린 듯 하다.
for문을 1번씩 순회하면서 처리했다. 순회 대상인 records 길이는 최대 1000 이고, map에 담긴 차량 또한 records 길이를 넘어갈 수 없기 때문에 각 대상에 대한 1번씩의 for문 처리는 크게 시간초과를 염려할 정도는 아니라고 판단했고, 구현만 제대로 한다면 시간초과 걱정없이 제대로 동작했다.
728x90
'코딩 테스트 [준비] > [문풀] 프로그래머스_문풀_조지기' 카테고리의 다른 글
프로그래머스 | LV.2 조건에 부합하는 중고거래 상태 조회하기 (MySQL) (1) | 2024.03.02 |
---|---|
프로그래머스 (카카오) | LV.3 파괴되지 않은 건물 - 누적합(😰) 문풀 (Java) (14) | 2024.03.02 |
프로그래머스 | LV.1 둘만의 암호 - 문자열 구현 문풀 (Java) (16) | 2024.03.02 |
프로그래머스 | LV.3 110 옮기기 - 문자열 구현 & Stack 활용 문풀 (Java) (21) | 2024.02.28 |
프로그래머스(위클리) | LV.2 교점에 별 만들기 - 구현 문풀 (Java) (22) | 2024.02.28 |