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

woolee의 기록보관소·2022년 11월 3일
0

알고리즘 문제풀이

목록 보기
35/178

문제 출처

프로그래머스 lev2 - 주차 요금 계산

문제

나의 풀이

  1. 객체를 만든 뒤, fe 객체에는 계산된 요금 값들이 더해지고 cnt 객체에는 IN일 때의 시간이 들어간다.

  2. IN일 때, cnt 객체에 사용 시간을 넣는다. (단, 00:00에 들어오는 경우도 있으므로 이때는 구분을 위해 -1로 계산해준다)
    OUT일 때, use에서 cnt객체value를 뺀 값을 요금으로 책정한 후, cnt의 value를 0으로 초기화해준다.

  3. cnt 중에 0이 아니라는 건, OUT 하지 않았다는 의미이므로 23:59에 나간 걸로 간주하는 계산을 해준다. -1이라는 의미는 00:00에 IN해서 OUT하지 않았다는 의미.

  4. for let .. in을 통해 순회하면서 요금을 계산해준다.

  5. 객첼르 배열로 바꿔준뒤, key값을 기준으로 정렬하고 forEach를 통해 순회하면서 value를 answer 배열에 push해준다.

function solution(fees, records) {
  let fe = {};
  let cnt = {};
  let answer = [];

  // 1
  for (let i=0; i<records.length; i++) {
    records[i]=records[i].split(' ');
    if (!fe[records[i]]) fe[records[i][1]]=0;
    if (!cnt[records[i]]) cnt[records[i][1]]=0;
  }

  // 2
  for (let i=0; i<records.length; i++) {
    let hours = records[i][0].slice(0,2);
    let minutes = records[i][0].slice(3,5);
    let use = (parseInt(hours, 10)*60) + parseInt(minutes, 10)
    if (records[i][2] == 'IN') {
      if (use === 0) {
        cnt[records[i][1]] = -1;
      } else {
        cnt[records[i][1]] = use;
      }
    }
    else if (records[i][2] == 'OUT') {
      if (cnt[records[i][1]] === -1) {
        fe[records[i][1]] += use - cnt[records[i][1]] + 1;
        cnt[records[i][1]] = 0;
      } else {
        fe[records[i][1]] += use - cnt[records[i][1]];
        cnt[records[i][1]] = 0;
      }
    }
  }

  // 3
  for (let x in cnt) {
    if (cnt[x] !== 0) {
      if (cnt[x] === -1) {
        fe[x] += ((23*60)+59);
        cnt[x]=0;
      } else {
        fe[x] += ((23*60)+59) - cnt[x];
        cnt[x]=0;
      }
    }
  }

  // 4
  for (let x in fe) {
    if (fe[x] > fees[0]) {
      fe[x] = fees[1] + (Math.ceil((fe[x]-fees[0])/fees[2]) * fees[3]);
    }
    else fe[x] = fees[1];
  }

  // 5
  Object.entries(fe).sort((a,b) => a[0]-b[0]).forEach(a => answer.push(a[1]));
  return answer;
}

console.log(
  solution([1, 461, 1, 10], ["00:00 1234 IN"]))

다른 풀이

나처럼 계속해서 for문을 순회하는 것보다, forEach 문 안에서 Destructuring을 하니까 코드의 가독성이 높아졌다.

function solution(fees, records) {
  const parkingTime = {};
  records.forEach(r => {
      let [time, id, type] = r.split(' ');
      let [h, m] = time.split(':');
      time = (h * 1) * 60 + (m * 1);
      if (!parkingTime[id]) parkingTime[id] = 0;
      if (type === 'IN') parkingTime[id] += (1439 - time);
      if (type === 'OUT') parkingTime[id] -= (1439 - time);
  });
  const answer = [];
  for (let [car, time] of Object.entries(parkingTime)) {
      if (time <= fees[0]) time = fees[1];
      else time = Math.ceil((time - fees[0]) / fees[2]) * fees[3] + fees[1]
      answer.push([car, time]);
  }
  return answer.sort((a, b) => a[0] - b[0]).map(v => v[1]);
}
// 차량번호 오름차순으로 청구요금 담아 배열로 리턴

// 청구요금 구하기
// 기본요금 fee[1] + ( 주차시간 - 기본시간fee[0] ) / fee[2] * fee[3] 

// 기본시간이내 : 기본요금 
// 출차 시간 max = 23:59
// 분 단위는 올림

// 주차시간 구하기 
// records.forEach(r => r.split(' ')

// log 객체에 {차번호: 시간} 저장
// IN 이면 + (24시간(분) - 입차시간)
// OUT이면 -(1430 - 출차시간)
// 24시간 = 1440분

// ex) 05:34 (05 * 60) + 34 = 334

console.log(
  solution([1, 461, 1, 10], ["00:00 1234 IN"]))
profile
https://medium.com/@wooleejaan

0개의 댓글