가치투자자

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

Problem Solving/Programmers

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

미주민 2023. 7. 13. 06:01
728x90
반응형

Programmers : 주차 요금 계산

🔗 문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

</> 이 글은 코딩테스트 대비와 알고리즘 공부를 위해 문제를 풀고 학습한 내용을 기록한 것입니다. 틀린 부분이나 추가해야 할 부분이 있다면 언제든 댓글로 남겨주세요❗️

 


💬 문제

이 문제는  객체 를 활용해 차량번호와 시간, 차량번호와 요금을 연결지으면 되는 구현 문제이다.

고려해줘야 할 것이 많지만, 객체에 대해 이해하고 있다면 충분히 풀 수 있는 문제였다.

 

  1. 주차장의 입/출차 내역과 요금표가 주어졌을 때, 차량별 주차 요금을 계산하려고 한다.

  2. 요금 (정수 배열 fees)

    - [기본 시간, 기본 요금, 단위 시간, 단위 요금]


    - 기본 시간 이하일 때, 기본 요금이 청구된다

    - 기본 시간 초과분에 대해서는 단위 시간마다 단위 요금이 청구된다

    - 단위 시간으로 나누어 떨어지지 않으면 올림한다

  3. 입/출차 내역 (문자열 배열 records)

    - "시각 차량번호 내역"


    - 입차 후 출차된 내역이 없다면, 23:59에 출차된 것으로 간주한다

    - 차량번호는 숫자 4개 번호

    - 내역은 IN 또는 OUT

  4. 차량 번호가 작은 순으로 주차 요금을 정수 배열에 담아 출력해주면 된다.

 

728x90

 


💡 입출력 예시

2번째 예시를 정리하면 다음과 같다.

차량 3961 = 16시 입차 - 18시 출차, 23시 58분 입차 / 차량 0202 = 16시 입차 - 18시 출차

차량 0202는 120분, 차량 3961은 121분 주차했으므로, 0202는 기본 요금으로 0원이고 3961은 1분 더 주차했으므로 올림해서 총 요금은 591원이다.

 

3번째 예시에서 차량 1234는 0시 0분에 들어왔지만, 나간 시각이 없기에 23시 59분에 나간 것으로 간주되어 요금은 (1439분 - 1분) / 1분 * 10원 = 14841원이다.

 

 

반응형

 


🔑 풀이1 : 객체

  • 요금표를 baseT(기본 시간), baseF(기본 요금), unitT(단위 시간), unitF(단위 요금)으로 구조분해할당 해준다.
  • records를 clock(시각), num(차량 번호), record(내역)으로 할당해준다.

    - 시각(clock)도 분해하여 분(min) 단위로 변환해준다(time)

  • 입/출차 내역

    - 차량이 들어왔으면, carIn에 num과 time을 쌍으로 넣어준다

    - 차량이 나왔을 때, 이전에 누적된 시간이 carOut에 있다면 거기에다가 더해준다

    - 차량이 나왔을 때, 이전에 누적된 시간이 없다면 주차한 시간을 carOut에 넣어주고, carIn에서는 제거해준다

  • 주차는 했지만 출차하지 않은 차량

    - 23시 59분에 출차한 것으로 간주해 주차 시간을 carOut에 추가해준다

  • [차량번호, 주차 시간] 형식으로 이차원 배열로 바꾼 뒤, 차량 번호를 기준으로 오름차순으로 정렬해준다.

  • 요금 계산

    - 기본 시간보다 짧게 주차했으면 기본 요금을, 그것보다 길게 주차했으면 초과분을 계산해 주차 요금을 정산해준다

    - 기본 시간으로 나눴을 때, 나머지는 올림해준다
function solution(fees, records) {
    const answer = [];
    const carIn = {};
    let carOut = {};
    const [baseT, baseF, unitT, unitF] = fees;
    
    // 시간 계산
    records.map((item) => {
        const [clock, num, record] = item.split(' ');
        const [hour, min] = clock.split(':');
        const time = parseInt(hour) * 60 + parseInt(min);
        
        if (record === 'IN') {
            carIn[num] = time;
        } else {
            carOut.hasOwnProperty(num)
                ? carOut[num] = carOut[num] + time - carIn[num]
                : carOut[num] = time - carIn[num];
            delete carIn[num];
        }
    });
    // 오늘 출차하지 않은 차량
    for (const [num, time] of Object.entries(carIn)) {
        carOut.hasOwnProperty(num)
            ? carOut[num] = carOut[num] + 1439 - time
            : carOut[num] = 1439 - time;
        delete carIn[num];
    }
    // 차량번호 오름차순 정렬
    carOut = Object.entries(carOut).sort((a,b) => a[0] - b[0]);
    
    // 요금 계산
    carOut.map((item) => {
        const time = item[1];
        answer.push(
            time <= baseT
                ? baseF
                : baseF + Math.ceil((time - baseT) / unitT) * unitF
        );
    })
    return answer;
}

 

실행 결과와 채점 결과는 다음과 같다.

 

 

728x90
반응형