본문 바로가기

프로그래머스/구현

[문자열 & 해시] 프로그래머스 '주차 요금 계산' - js

반응형

1. 문제

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

 

프로그래머스

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

programmers.co.kr

2. 코드

이 문제는 주어진 records 배열을 계산하기 쉽게 지지고 볶아주는 것이 포인트다. 나는 객체와 해시 맵을 사용했다. 자세한 설명은 주석으로 대신한다.

function solution(fees, records) {
    let newR = [],car = {}, map = new Map(), fee = [], temp = [];
    
    // 계산하기 편하게 빈칸 기준으로 값 나눠주기(newR)
    // [[차량 이름, 입출차 시각, 입/출차]...]
    // 각 차량의 총 주차 시간을 저장하기 위핸 객체 만들어주기(car)
    // {"차량이름" : [주차 시간1, 주차시간2...]}
    for(let i=0;i<records.length;i++){
        newR.push(records[i].split(" "));
        if(!(records[i].split(" ")[1] in car)) car[records[i].split(" ")[1]] = [];
    }
  
    // 해시 맵을 만들어 차량 별 입출차 시간에 따른 주차 시간 계산하기
    // 입차라면 해시 맵에 해당 차량 입차 시각 저장하기
    // 출차라면 car에 해당 차량 주차 시간 계산하여 넣고 맵에 해당 차량 값 0으로 리셋
    // (다음에 또 입차할 수 있으므로)
    // 이때 temp 배열에 차량 입차하면 해당 차량 이름 넣고, 
    // 출차하면 해당 차량 이름 빼는 식으로 입출차 관리하기
    while(newR.length){
        let time = Number(newR[0][0].split(":")[0]) * 60 + Number(newR[0][0].split(":")[1]);
        if(newR[0][2] === "IN") {
          temp.push(newR[0][1])
          map.set(newR[0][1], time);
        }else{
          car[newR[0][1]].push(time - map.get(newR[0][1]));
          map.set(newR[0][1],0);
          temp.splice(temp.indexOf(newR[0][1]),1);
        }
        newR.shift();
    }
    
    // 입차 기록만 있고 출차 기록이 없는 차량들을 모아 23:59까지의 주차 요금 따져서 더해주기
    if(temp.length){
        for(let i=0;i<temp.length;i++){
          car[temp[i]].push((23 * 60 + 59) - map.get(temp[i]))
        }
    }       

    // 각 차량의 최종 요금 구하기. [차량 이름, 최종 요금] 형식으로 저장
    for(let key in car){
      let total = car[key].reduce((a,c) => a+=c,0) > fees[0] ? Math.ceil((car[key].reduce((a,c) => a+=c,0) - fees[0])/fees[2]) * fees[3] : 0;
      fee.push([key,fees[1] + total])
      total = 0;
    }
    // 차량 번호 오름차순으로 정렬하여 요금 값만 모은 배열 리턴하기
    return fee.sort((a,b) => a[0] - b[0]).map(el => el[1]);
}
반응형