[프로그래머스] 주차 요금 계산

Alex J. Lee·2022년 2월 18일
0

Coding Test

목록 보기
4/8
post-thumbnail

코딩테스트 연습 - 주차 요금 계산

코딩테스트 연습 - 주차 요금 계산

2022 KAKAO BLIND RECRUITMENT

LEVEL 2

문제설명

주차장의 요금표 fees와 차량의 입출기록이 담긴 records가 주어졌을 때, 차량별로 누적 주차시간에 대한 주차 요금을 담은 배열을 return하는 solution함수를 작성하시오,

  • fees: [기본시간(분), 기본요금(원), 단위시간(분), 단위요금(원)]
  • records의 각 요소 "시각 차량번호 IN/OUT" 형식의 문자열
  • 어떤 차량의 출차 내역이 없다면 23:59에 출차된 것으로 간주
  • 주차요금은 00:00시부터 23:59까지의 입출차 내역을 바탕으로 누적 주차 시간에 부과
    • 누적 주차 시간 <= 기본 시간 : 기본 요금 청구
    • 누적 주차 시간 > 기본 시간 : 기본 요금 + 초과 시간에 대해 단위 시간마다 단위 요금 청구
    • 초과 시간이 단위 시간으로 나누어 떨어지지 않으면 올림

INPUT

fees

  • 길이 4
  • fees[0] = 기본시간(분)
  • 1 ≤ fees[0] ≤ 1,439
  • fees[1] = 기본요금(원)
  • 0 ≤ fees[1] ≤ 100,000
  • fees[2] = 단위시간(분)
  • 1 ≤ fees[2] ≤ 1,439
  • fees[3] = 단위요금(원)
  • 1 ≤ fees[3] ≤ 10,000

records

  • 1 <= records의 길이 <= 1,000
  • 각 요소는 "시각 차량번호 IN/OUT" 형식의 문자열 (하나의 공백으로 구분됨)
  • 시각 : HH:MM 형식으로 00:00부터 23:58까지 주어짐 (23:59의 경우 입력으로 주어지지 않음)
  • 차량번호 : 0~9로 구성된 길이 4의 문자열 (각 차량은 고유 차량번호를 가짐)
  • 내역 : IN (입차) 또는 OUT (출차)

OUTPUT

  • 차량번호가 작은 자동차부터 청구할 주차요금을 차례대로 담은 정수 배열

나의 풀이

  1. records 배열을 순회하며 carsInfo 객체를 채운다.

    • carsInfo는 차량번호를 key로, 해당 차량의 입출차 시간을 순서대로 담은 배열을 value로 갖는다.
  2. carsInfokey들을 담은 배열 cars 를 생성한 뒤, 오름차순으로 정렬한다.

  3. inTimeoutTime을 인자로 받아 주차시간을 계산하는 함수 calcTimeDiff를 작성한다. (출력값의 시간단위: 분)

  4. cars 배열을 순회하며 각 차량별 누적 주차시간을 계산한 뒤, 주차요금을 구하여 answer 배열에 push한다.

  5. answer 배열을 return한다.

function solution(fees, records) {
    // 1. records 배열을 순회하며 carsInfo 객체를 채운다
    // carsInfo = {
    // '0000': ['06:00', '06:34', '18:59'],
    // ...
    // }
    const carsInfo = {};
    for (let record of records) {
        const [time, car, inout] = record.split(' ');
        carsInfo[car] = carsInfo[car] || [];
        carsInfo[car].push(time);
    }
    // 2. carsInfo의 key들을 담은 배열 cars를 생성한 뒤,
    //    오름차순으로 정렬한다
    const cars = Object.keys(carsInfo).sort();
    // 3. inTime, outTime을 인자로 받아 주차시간을 계한하는 함수 calcTimeDiff를 작성한다 (출력값의 시간단위: 분)
    function calcTimeDiff(inTime, outTime = '23:59') {
        const start = inTime.split(':');
        const end = outTime.split(':');
        const startDate = new Date(0, 0, 0, start[0], start[1], 0);
        const endDate = new Date(0, 0, 0, end[0], end[1], 0);
        const diff = endDate - startDate;
        const minutes = Math.floor(diff / 1000 / 60);
        return minutes;
    }
    // 4. cars 배열을 순회하며 누적 주차시간을 구한 뒤,
    //    각 차량별 주차요금을 계산하여 answer배열에 push한다
    const answer = [];
    const [defaultTime, defaultFee, unitTime, unitFee] = fees;
    for (let car of cars) {
        // 4-1. 누적 주차시간 구하기
        let totalTime = 0;
        for (let i = 0, n = carsInfo[car].length; i < n; i += 2) {
            totalTime += calcTimeDiff(carsInfo[car][i], carsInfo[car][i + 1]);
        }
        // 4-2. 주차요금 구하기
        let totalFee = defaultFee;
        if (totalTime > defaultTime) {
            const units = Math.ceil((totalTime - defaultTime) / unitTime);
            totalFee += unitFee * units;
        }
        answer.push(totalFee);
    }
    // 5. answer 배열을 return한다
    return answer;
}
profile
🦄✨글 잘 쓰는 개발자가 되기 위해 꾸준히 기록합니다 ✨🦄

0개의 댓글