프로그래머스 | 주차 요금 계산 | 2022 카카오 블라인드 | Javascript

고광필·2022년 2월 12일
0

알고리즘

목록 보기
6/12

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

프로그래머스에 있는 2022 카카오 블라인드 문제 중 주차 요금 계산 문제입니다.

초기에 변수 구조를 잘못 잡았고, 무엇보다 문제를 잘못 읽는 바람에
푸는데 1시간 넘게 걸렸습니다.

문제

주차 기본 요금 관련 정보와 주차장 출입 차량 정보를 입력받아서
주차장을 이용한 자동차들의 요금을 '차량번호가 작은 자동차부터 금액을 정렬'하여 반환합니다.

코드

function solution(fees, records) {
  const IN = "IN";
  const [defaultTime, defaultCost, minute, cost] = fees;
  const carLog = {};
  const answer = [];

  // 시간 계산
  for (let record of records) {
    const [time, carNum, log] = record.split(" ");

    // 입차
    if (log === IN) {
      // 첫 입차
      if (!carLog[carNum]) {
        carLog[carNum] = [time];
        continue;
      }
      carLog[carNum] = [...carLog[carNum], time];
      continue;
    }
    // 출차
    carLog[carNum] = [...carLog[carNum], time];
  }

  // 시간에 따른 요금 계산
  for (let carNum of Object.keys(carLog)) {
    // 출차 기록이 없으면 23:59 출차
    if (carLog[carNum].length % 2 === 1)
      carLog[carNum] = [...carLog[carNum], "23: 59"];

    let result = 0;
    let money = defaultCost;
    for (let i in carLog[carNum]) {
      const [min, sec] = carLog[carNum][i].split(":");
      if (i % 2 === 0) {
        result -= Number(min) * 60 + Number(sec);
        continue;
      }
      result += Number(min) * 60 + Number(sec);
    }
    // 기본시간 초과
    if (result > defaultTime)
      money += Math.ceil((result - defaultTime) / minute) * cost;

    answer.push([carNum, money]);
  }

  return answer.sort((a, b) => a[0] - b[0]).map((element) => element[1]);
}

풀이

  1. 차량별로 기록을 순회하며 입차, 출차 시간을 통해 주차장 이용 시간을 계산합니다.
  2. 차량별 주차장 이용 시간에 맞는 요금을 계산합니다.
  3. 차량번호가 낮은순으로 요금을 반환합니다.

정리

마지막 차량 기록이 IN인지 OUT인지도 변수로 저장했는데, 코드를 작성하다보니 length의 홀짝 유무로 판단이 가능해서 초기 코드를 지워버렸다.
초기 변수 설정을 잘하자

문제의 반환 형태를 잘못 읽어서 한참을 헤매었다.
문제의 요구사항을 다시 정확하게 이해하자

profile
이해하는 개발자를 희망하는 고광필입니다.

0개의 댓글