Algorithm/프로그래머스

2022 KAKAO BLIND RECRUITMENT) 주차 요금 계산

choogro 2022. 8. 4. 14:32

https://school.programmers.co.kr/learn/courses/30/lessons/92341?language=javascript 

 

프로그래머스

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

programmers.co.kr

분할 정복(Divide and conquer algorithm)을 이용하여 문제에서 구해야할 값들을 세분화 시킬 수 있습니다.

1. 주차 시간

2. 주차 시간을 요금으로 환산

3. 정렬

 

function solution(fees, records) {
  var answer = [];
  const check = new Map();
  const sum = new Map();
  // 주차 요금 계산
  function calculate(feesArr, totalTime) {
    const minTime = feesArr[0];
    const minFee = feesArr[1];
    const unitTime = feesArr[2];
    const unitFee = feesArr[3];
    return (
      minFee +
      Math.ceil((totalTime > minTime ? totalTime - minTime : 0) / unitTime) *
        unitFee
    );
  }
  // 개별 주차 시간
  records.forEach((info) => {
    info = info.split(" ");
    const minutes = info[0].slice(0, 2) * 60 + Number(info[0].slice(3, 5));
    if (check.has(info[1]) && info[2] === "OUT") {
      if (sum.has(info[1]))
        sum.set(info[1], sum.get(info[1]) + minutes - check.get(info[1])[0]);
      else sum.set(info[1], minutes - check.get(info[1])[0]);
      check.delete(info[1]);
    } else check.set(info[1], [minutes, info[2]]);
  });
  [...check.keys()].forEach((v) =>
    sum.set(v, sum.get(v) + 1439 - check.get(v)[0] || 1439 - check.get(v)[0])
  );
  // 정렬
  answer = [...sum.keys()]
    .sort((a, b) => a - b)
    .map((v) => calculate(fees, sum.get(v)));
  return answer;
}