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

2025. 7. 1. 16:33·Problem Solving/프로그래머스

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

주차장의 요금표와 차량의 입/출차 기록이 주어졌을 때, 차량별 주차 요금을 계산하려고 한다.

요금표는 `[기본 시간(분), 기본 요금(원), 단위 시간(분), 단위 요금(원)]` 형태의 배열로 주어진다.

입/출차 기록은 `[시각(시:분), 차량 번호, 내역(입/출)]` 형태의 배열로 주어진다.

주차 요금 계산은 다음과 같은 기준으로 이루어진다.

  • 입차 후 출차 기록이 없으면 23:59에 출차된 것으로 간주한다.
  • 주차 시간이 기본 시간 이하면 기본 요금이 청구된다.
  • 기본 시간을 초과하면 기본 요금에 더해 단위 시간마다 단위 요금이 청구된다. (나누어 떨어지지 않으면 올림한다.)

 

풀이

주차 요금을 계산하기 위한 자료구조를 어떻게 구성할지 고민을 많이 했다. 배열로 만들 수도 있고, 객체로 만들 수도 있고, 맵으로도 만들 수 있었다. 그러나 아직 JS에서 객체에 존재하는 키를 찾는 방법이나, 객체에 엔트리를 할당하는 방법이 익숙하지 않아 쉬운 방법은 아니었다. 어떤 걸 활용해야 간단하고 효율이 좋을지 항상 고민하지만, 일단은 구현해서 정답을 맞추는 것이 우선되어야 할 것 같다. 몇 문제 풀다보면 익숙해질 것 같다.

 

차량 번호를 기준으로 주차 요금을 계산해야 한다. 차량 번호를 유일한 키로 갖는 자료구조가 필요하다.

주차 요금 계산에 필요한 정보는 사용 시간과 현재 기록이 "입차"인지, "출차"인지 구분하여 "입차"인 경우, 입차 기록을 남겨 출차 기록이 발견되면 주차 시간으로 주차 요금을 계산해야 한다. 해당 차량의 출차 기록이 없는 경우엔 별도의 계산이 필요하다. "출차"인 경우, 문제 조건에 따라 반드시 입차 기록이 존재하므로 입차 시간을 기준으로 출차 시간과 비교해 해당 차량의 주차 시간을 계산한다.

 

코드

function solution(fees, records) {
    // 차량 번호를 기준으로 주차 요금 계산
    // 주차요금 계산에 필요한 정보: 
    // 1. 몇분을 사용했는지? 
    // 2. "IN"인지 "OUT"인지?
    const inMap = new Map();
    const totalTime = new Map();
    for (const record of records) {
        const [timeStr, carNum, state] = record.split(" ");
        const time = timeStrToMinute(timeStr);
        console.log(time);
        if (!inMap.has(carNum)) {
            inMap.set(carNum, time);
        } else {
            const inTime = inMap.get(carNum);
            const used = time - inTime;
            inMap.delete(carNum);
            
            totalTime.set(carNum, (totalTime.get(carNum) || 0) + used);
        }
    }
    
    const LAST_TIME = timeStrToMinute("23:59");
    for (const [carNum, inTime] of inMap.entries()) {
        const used = LAST_TIME - inTime;
        totalTime.set(carNum, (totalTime.get(carNum) || 0) + used);
    }
    
    const answer = Array.from(totalTime.entries())
        .sort((a, b) => a[0].localeCompare(b[0]))
        .map(([carNum, usedTime]) => calculateFee(fees, usedTime));
    
    return answer;
}

function timeStrToMinute(time) {
    const [h, m] = time.split(":").map(Number);
    return h * 60 + m;
}

function calculateFee([baseTime, baseFee, unitTime, unitFee], usedTime) {
    if (usedTime <= baseTime) {
        return baseFee;
    } else {
        return baseFee + Math.ceil((usedTime - baseTime) / unitTime) * unitFee; 
    }
}
저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[프로그래머스/JavaScript] 프렌즈4블록  (0) 2025.07.03
[프로그래머스/JavaScript] 파일명 정렬  (0) 2025.07.01
[프로그래머스/Java] 다트 게임  (2) 2025.05.30
[프로그래머스/Java] 압축  (0) 2025.05.30
[프로그래머스/Java] k진수에서 소수 개수 구하기  (2) 2025.05.29
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스/JavaScript] 프렌즈4블록
  • [프로그래머스/JavaScript] 파일명 정렬
  • [프로그래머스/Java] 다트 게임
  • [프로그래머스/Java] 압축
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    N과 M
    구현
    vite
    소수 판별
    투 포인터
    삼성 sw 역량테스트
    react
    그리디
    정렬
    문자열
    JavaScript
    구간 합
    dp
    맵
    java
    수학
    이분 탐색
    순열
    BFS
    코드트리
    시뮬레이션
    집합
    dfs
    intersection observer
    백트래킹
    프로그래머스
    누적 합
    완전 탐색
    백준
    매개 변수 탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[프로그래머스/JavaScript] 주차 요금 계산
상단으로

티스토리툴바