프로그래머스 LEVEL 2. 주차 요금 게산하기(JavaScript)

Bendeso·2023년 9월 2일
0
post-thumbnail

❗ 문제 설명


❗ 제한 사항

❗ 입출력 예

❗ 문제 요약
입차, 출차 기록을 통해 차량별 주차 요금을 계산해라

주의 사항

  • 입차기록만 있고 출차기록이 없다면 23:59에 출차한 것으로 간주
  • 기본 시간 이하라면, 기본요금 적용
  • 초과한 시간이 단위 시간 단위로 떨어지지 않으면 올림 처리

이 문제를 보고 바로 차량번호와 입차와 출차의 차를 객체로 관리해야겠다는 생각이 들었다.
구현을 하는 것엔 시간이 별로 걸리지 않았는데
조건 중 입차기록만 있고 출차기록이 없을 때 23:59분에 출차한 것으로 간주한다는 조건에서 조금 막혔다.
어떻게 입차하고 출차 했는지를 관리할지 고민하는 것에 시간을 많이 썼다.

결국 해결방안으로 찾은 것이 객체를 하나 더 만드는 것이었다.
그래서 입차와 출차의 차를 관리하는 객체와 입차했는지 출차했는지 관리하는 객체,
두 개의 객체를 만들었다.

코드

function solution(fees, records) {
    const answer = [];
    const car = {};
    const carsInout = {};
    const [basicTime, basicFee, min, fee] = fees;
    
    for (let i = 0; i < records.length; i++) {
        let [time, carNumber, inout] = records[i].split(" ");
        const [hours, minutes] = time.split(':');
        carsInout[carNumber] = inout;
        
        time = 60 * Number(hours) + Number(minutes);
        
        if (inout === "IN") {
            if (!car[carNumber]) car[carNumber] = 0
            car[carNumber] =  time - car[carNumber];
        } else if (inout === "OUT")
            car[carNumber] = time - car[carNumber] ; 
    }
    
    for (let [carNumber, inout] of Object.entries(carsInout)) {
        if (inout === "IN") car[carNumber] = 1439 - car[carNumber];
    }

    
    
    for (let [carNumber, time] of Object.entries(car)) {
        if (time > basicTime) {
            time = Math.ceil((time - basicTime) / min) * fee + basicFee;
        } else time = basicFee;
        
        answer.push([carNumber, time]);
    }
    
    
    return answer.sort((a, b) => a[0] - b[0]).map(car => car[1]);
    
}


// 입차, 출차 기록을 통해 차량별 주차 요금을 계산해라

// 주의 사항
// 입차기록만 있고 출차기록이 없다면 23:59에 출차한것으로 간주
// 기본 시간 이하라면, 기본요금 적용
// 초과한 시간이 단위 시간 단위로 떨어지지 않으면 올림 처리

위 코드처럼 입차와 출차의 기록을 관리하는 객체를 통해 입차기록만 있다면 23:59을 분으로 만든 1439에서 해당 차량의 입출차의 차를 빼주는 것으로 구현했다.
그 후 절대값으로 만들어서 비교를 진행했다.

마무리하며

너무 어렵지 않으면서도 생각보다 재밌는 문제였다.
아직 map에 익숙하지 않아서 사용하지 않았는데 map을 통해서 구현하면 더 쉽게 구현할 수 있을 것 같다.

profile
성장을 위한 몸부림

0개의 댓글