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

2023. 8. 7. 14:04코딩연습

1. 문제

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

 

프로그래머스

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

programmers.co.kr

 

2. 풀이

  • solution으로 fees와 records 라는 인자(매개변수)가 들어온다.
  • 형태는 
fees : [기본 시간(분), 기본 요금(원), 단위 시간(분), 단위 요금(원)]

records : [시간 차량번호 입/출, ...]
  • 접근한 방식은 "차량번호 : [입차시간, 출차시간, 입차시간...]" 을 모아두고 만약 입/출차 시간의 길이가 홀수라면 23:59 시간을 배열에 추가하는 방식으로 진행했다. 
  • 그 후, 해당 차량번호의 출차시간에서 입차시간을 뺀 시간들을 모두 합하여 계산했다.
function solution(fees, records) {
    const result = []; // 결과값을 담을 배열
    const parking = {}; // "차량번호 : [시간]"을 담을 object
    fees = fees.map(v => +v); // 요금표를 모두 정수형으로 변경.
    
    // records 안에 있는 시간 형태를 분으로 바꿔줄 함수.
    const convertStringtoMin = (time) => {
        let [h, m] = time.split(":").map(v => +v);
        return h*60+m;
    }
    
    // records를 통하여 "차량번호 : [시간]"을 만듬.
    records.forEach(record => {
        const [time, carNum, inOut] = record.split(" ");
        if(!parking[carNum]) parking[carNum] = [time]; // 초기 차량번호와 시간을 넣음.
        else parking[carNum].push(time)
    })
    
    // 출력형태가 차량번호 순으로 되어있기 때문에 배열로 변환 후 정렬.
    const parkingArr = Object.entries(parking).sort();
    
    // 정렬된 형태를 이용.
    parkingArr.forEach(car => {
        const inOut = car[1]; // 차량의 입출차시간을 담은 배열.
        let parkedTime = 0; // 누적 주차 시간.
        
        // 만약 입차되었지만 출차된 기록이 없다면 23:59에 출차된 것으로 간주된다.
        // 따라서 입출차시간을 담은 배열이 짝수개가 아니라면 23:59 시간을 추가해야 한다.
        if(inOut.length % 2 === 1) inOut.push('23:59');
        
        // 시간 계산.
        for(let i = 0; i < inOut.length; i += 2){
            parkedTime += (convertStringtoMin(inOut[i+1]) - convertStringtoMin(inOut[i]));
        }
        
        // 만약 누적된 주차 시간이 기본 시간보다 작다면 기본 요금 부여.
        if(parkedTime <= fees[0]) result.push(fees[1]);
        else {
        	// 누적된 주차 시간이 기본 시간보다 크다면 요금 계산.
            let parkFees = fees[1] + Math.ceil((parkedTime - fees[0]) / fees[2]) * fees[3];
            result.push(parkFees);
        }
    })
    
    return result;
}

 

3. 정리

  • 다른 사람분의 풀이를 보니 23:59를 처음부터 시간으로 변환하여 풀이를 하신 분들도 있었다.
  • 예전에 처음 프로그래머스 문제 Lv.1을 풀 때 카카오 관련된 문제를 푼 기억은 그리 좋지 않았다. 너무 어려워서 손도 못댈 정도였는데, 몇개월동안 코딩테스트 준비하면서 매일같이 문제를 풀어서 그런지 실력이 많이 늘은 것 같아 뿌듯했다. 
  • 프로그래머스 Lv3을 풀 수 있을 정도로 더 노력해야하는데........... 갈길이 멀다...............