drop-of-water

문제 링크

조건

  • 차량에 입차 내역만 있고 출차 내역이 없으면 23:59에 출차된 것
  • 누적 주차 시간이 기본 시간 이하인 경우 -> 기본 요금
  • 누적 주차 시간이 기본 시간을 초과한 경우 -> (기본요금 + 올림(누적시간 - 기본시간) / 단위시간) x 단위 요금)

입력값

  • fees = 주차 요금 항목 (배열)
  • records = 자동차 입/출력 내역 (배열)

출력값

  • 자동차 청구 주차 요금 (배열)
  • 차량 번호가 작은 자동차 순서대로 담아야됨

풀이과정

  • Hashmap을 사용해 각 자동차에 대해 입차시간, 총 주차 시간을 저장
  • 출차 내역이 없는 자동차들의 총 주차 시간을 계산하기 위해 입차, 출차를 동기화 하는 배열 사용
  • IN인 경우 입차시간을 업데이트
  • OUT인 경우 출차시간 - 입차시간을 계산해 총 주차 시간을 업데이트
  • 출차 내역이 없는 자동차들의 총 주차 시간을 업데이트
  • 모든 자동차의 총 주차 시간을 확인 하면서 총 주차 시간이 기본 시간 이하인 경우 기본 요금, 기본 시간을 초과한 경우 조건에서 사용된 공식을 사용해 요금 계산
  • 낮은 차량 번호 순으로 정렬

코드

function solution(fees, records) {
  const answer = [];
  const record_hashmap = {};
  const remaining_cars = [];
  const [basic_min, basic_fee, unit_time, unit_fee] = fees;

  records.forEach((record) => {
    const [clock, car_num, status] = record.split(' ');
    const [hour, min] = clock.split(':').map(Number);
    let in_time = hour * 60 + min;

    if (status === 'IN') {
      if (!record_hashmap[car_num]) {
        record_hashmap[car_num] = [in_time, 0];
      } else {
        record_hashmap[car_num] = [in_time, record_hashmap[car_num][1]];
      }

      remaining_cars.push(car_num);
    } else if (status === 'OUT') {
      const in_time = record_hashmap[car_num][0];
      const out_time = hour * 60 + min;
      const total_in_time = out_time - in_time;

      remaining_cars.splice(remaining_cars.indexOf(car_num), 1);

      record_hashmap[car_num][1] += total_in_time;
    }
  });

  // 출차 내역이 없으면 23:59에 출차
  for (let car_num of remaining_cars) {
    const last_in_time = record_hashmap[car_num][0];
    const total_in_time = 23 * 60 + 59 - last_in_time;

    record_hashmap[car_num][1] += total_in_time;
  }

  for (const car in record_hashmap) {
    const total_time = record_hashmap[car][1];

    // 기본 요금 or (기본요금 + 올림(누적시간 - 기본시간) / 단위시간) x 단위 요금)
    let total_fee =
      total_time <= basic_min
        ? basic_fee
        : basic_fee + Math.ceil((total_time - basic_min) / unit_time) * unit_fee;
    answer.push([car, total_fee]);
  }

  // 차량 번호가 작은 자동차 순서대로 담아야됨
  return answer.sort((a, b) => a[0] - b[0]).map((v) => v[1]);
}

😊