본문 바로가기
  • 살짝 구운 김 유나
Algorithm/Programmers

[Lv.2] 주차 요금 계산 - JavaScript

by yunae 2023. 5. 9.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/92341

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

한 차량이 주차장을 여러번 방문했을 경우도 생각해야 한다.

한 번 이용했을 때의 시간들을 계산해서 리스트의 형태로 관리해야 하는 문제!

그 외에는 하라는 대로 하면 되는 문제이다. 자세한 설명은 주석 참고~̆̈

 

코드

function solution(fees, records) {
  var answer = [];

  let bill = {};
  records.forEach((record) => {
    // 시간, 차량번호, 상태
    let [strTime, num, state] = record.split(" ");
    // 문자열 시간을 숫자로 변경해주기
    const time = stringToTime(strTime);
    // 아직 없는 번호인 경우
    if (bill[num] === undefined) {
      // 들어간 시간 저장
      bill[num] = [[time, false]];
    } else {
      // 들어가는 차량이라면 들어간 시간과 상태를 리스트에 추가
      if (state === "IN") {
        bill[num].push([time, false]);
      } else {
        // 나오는 차량인 경우
        let last = bill[num].length - 1;
        // 나온 시간 - 맨 마지막으로 들어갔던 시간으로 다시 저장하기
        bill[num][last][0] = time - bill[num][last][0];
        bill[num][last][1] = true;
      }
    }
  });

  // 객체 순회하기
  const keys = Object.keys(bill);
  for (let key of keys) {
    let totalTime = 0;
    // 주차장 이용한 총 시간 계산
    bill[key].forEach((item) => {
      //아직 빠져나가지 않은 차량이라면 23:59(1439 = 23*60 + 59)에 나간것으로 처리
      if (!item[1]) {
        item[0] = 1439 - item[0];
      }
      // 총 시간에 합산
      totalTime += item[0];
    });

    // 요금계산하기
    let totalFee = fees[1];
    // 기본 시간을 초과했다면
    if (totalTime > fees[0]) {
      // 추가 요금 계산하여 합산
      totalFee += Math.ceil((totalTime - fees[0]) / fees[2]) * fees[3];
    }
    // 차량 번호와 합산한 요금 함께 리스트에 담기
    answer.push([key, totalFee]);
  }

  // 차량 번호가 작은 순서대로
  answer.sort((a, b) => a[0] - b[0]);
  // 요금만 따로 추출하기
  return answer.map((a) => a[1]);
}

// 문자열 시간을 숫자로 변환하는 함수 선언
const stringToTime = (str) => {
  const [hour, minute] = str.split(":");
  return Number(hour) * 60 + Number(minute);
};

 

 

 

 

댓글