본문 바로가기
일반 학습/코딩 테스트

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

by StelthPark 2022. 3. 14.

처리조건

풀이

입력 : solution([180, 5000, 10, 600],["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"]);

 

두번째 인자로 받은 자동차의 입차출차기록을 배열로 split하여 나눠주는 것으로 시작했다. 그런다음에 빈 객체 note를 만들었고 객체key값은 중복되지 않는다는 점을 이용해 총 입출차 기록을을 for문을 돌려 검사하면서 차량번호들을 note 객체안에 key값으로 존재하는지 확인하고 존재하지않는다면 차량번호를 key로 value를 빈 배열로 만들어주고 value에 만들어진 빈배열에 입출차시간을 push한다. 만약 차량번호 key가 존재한다면 배열을 만들지않고 기존배열에 시간을 push해준다.

 

결과값으로 차량 번호별 입출차 기록들이 모두 배열안에 들어가게되고 이후에 리턴값이 차량번호의 오름차순으로 정렬해야하니 키들만 배열로 불러와 keyArr에 할당하고 sort하여 오름차순으로 정리한다.

오름차순으로 정리 된 키들의 배열로써 이제 이 키들을 이용해 note[key]로 value인 시간기록들을 볼 것이다.

 

keyArr을 for문으로 돌려 각 해당하는 차량번호의 시간을검사하는데 만약 시간이 3개있다면 마지막 시간은 23:59분까지 있었던 걸로 계산해야하고 2개라면 출차시간-입차시간을 해주면 될 것이다. 그래서 이중 for문에서 j를 +2씩 계산하여

j와 j+1을 각각 계산하여 totalTime인 총 주차장에서 보낸시간을 계산할 것이다.

 

계산이 완료된 totalTime은 기본시간보다 큰지 적은지 검사하고 만약 적다면 기본요금만 해당 차량의 총 요금에 푸시한다. 기본시간보다 크다면 내부에서 다시한번 totalTime에서 기본시간을 빼고 단위시간을 나눈 것이 1보다 커야한다 만약 작다면 단위시간보다 적게 있었지만 일단 있었던 것이니 단위시간을 만족하진 못했지만 1번의 단위시간만큼의 요금이 나올 것이다. 그래서 기본료+단위시간*1를 되돌려주고 1보다 크다면 단위시간보다 오래 있었던 것이니 math.ceil을 통해 2.5 단위시간 만큼 있었다면 3을 2 단위시간만큼 있었다면 2를 돌려주기위해 처리한다.

 

찾아보니.. 20-30분 안에 풀어야한다고 한다. 1시간 반 정도 걸렸다.. 그래도 계속 풀다보면 빨리 풀 수 있겠지..

 

function solution(fees, records) {
  let note = new Object();
  let results = [];
  let newArr = records.map((records) => {
    return records.split(" ");
  });
  for (let i = 0; i < newArr.length; i++) {
    if (Object.keys(note).includes(newArr[i][1])) {
      note[[newArr[i][1]]].push(newArr[i][0]);
    } else {
      note[[newArr[i][1]]] = [];
      note[[newArr[i][1]]].push(newArr[i][0]);
    }
  }

  let keyArr = Object.keys(note);
  keyArr.sort();

  for (let i = 0; i < keyArr.length; i++) {
    let carRecord = note[keyArr[i]];
    let totalTime = 0;
    for (let j = 0; j < carRecord.length; j = j + 2) {
      if (carRecord[j + 1] !== undefined) {
        let hour = carRecord[j + 1].slice(0, 2) - carRecord[j].slice(0, 2);
        let minute = carRecord[j + 1].slice(3) - carRecord[j].slice(3);
        let pakingTime = 60 * hour + minute;
        totalTime += pakingTime;
      } else {
        let hour = 23 - carRecord[j].slice(0, 2);
        let minute = 59 - carRecord[j].slice(3);
        let pakingTime = 60 * hour + minute;
        totalTime += pakingTime;
      }
    }

    if (totalTime > fees[0]) {
      let result = 0;
      if ((totalTime - fees[0]) / fees[2] <= 1) {
        result = fees[1] + 1 * fees[3];
      } else if ((totalTime - fees[0]) / fees[2] > 1) {
        result = fees[1] + Math.ceil((totalTime - fees[0]) / fees[2]) * fees[3];
      }
      results.push(result);
    } else if (totalTime <= fees[0]) {
      results.push(fees[1]);
    }
  }
        return results;
}

댓글