[TIL #15] 주차 요금 계산

2024. 9. 24. 20:11·Camp/T.I.L.

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

 

프로그래머스

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

programmers.co.kr

 

또 나온 2022 카카오 블라인드 채용 문제.

문제가 꽤 괜찮은 것 같다는 생각이 든다.

 

주차장 출입 관리를 하는 솔루션을 작성해야 한다.

입차한 차량이 또 입차하거나, 출차한 차량이 또 출차하는 예외 상황이 없는 것이 정말 다행이었다.

 

일단 생각의 흐름은 이렇다.

  1. 입/출차 시간이 "시:분"의 형태로 주어진다
     - 분으로 바꿔서 계산해야 한다.
  2. 맵을 적극적으로 사용할 수 있을 것 같다
     - 차량 번호 별 비용 계산이나 입출차 확인을 위해 편할 것 같다고 생각했다.
  3. 일단 최종 출차 기록이 있는 차량 확인
  4. 그럼 자연스럽게 출차 기록이 없는 차량이 남는다
  5. 다 확인한 후 비용 계산
  6. 차량 번호 기준 정렬 후 결과 리턴

 

먼저 기록 확인부터.

let carMap = new Map();
let io = new Map();
let res = new Map();

for (let item of records) {
    let record = item.split(" ");
    const carNum = record[1];
    const time = inMin(record[0]);
    if (record[2] === "IN") {
        carMap.set(carNum, (carMap.get(carNum) || 0) - time);
        io.set(carNum, 1);
    } else {
        carMap.set(carNum, carMap.get(carNum) + time);
        io.set(carNum, 0);
    }
}

"IN"이 아니면 무조건 "OUT"이기 때문에 ``else``로 처리 가능.

전부 분으로 처리해 더해준다.

 

// 출차 없는 차 확인
const maxMin = inMin("23:59");
for (const [carNum, status] of io) {
    if (status === 1) {
        carMap.set(carNum, carMap.get(carNum) + maxMin);
    }
}

출차 이력이 없는 차량들은 "23:59"출차로 간주한다.

이제 보니 저건 전역 상수로 둬도 괜찮았을 것 같다.

 

// 요금 계산
for (const [carNum, totalMin] of carMap) {
    const curFee = res.get(carNum) || 0;
    if (totalMin <= fees[0]) {
        res.set(carNum, curFee + fees[1]);
    } else {
        const overFee = Math.ceil((totalMin - fees[0]) / fees[2]) * fees[3];
        res.set(carNum, curFee + fees[1] + overFee);
    }
}

// 차량 번호 기준 정렬
const sortedRes = new Map([...res.entries()].sort((a, b) => a[0].localeCompare(b[0])));

return [...sortedRes.values()];

요금을 일괄로 계산한다.

요금 관련한 변수들은 보기 좋게 이름을 다 붙여줬어야 했다...

 

그리고 차량 번호 기준으로 오름차순 정렬한다.

번호가 문자열이므로 문자열 비교를 통해 정렬한다.

그리고 ``value``만 뽑아서 배열로 리턴해 준다.

 

2 레벨 문제치고 어려운 편은 아니었던 것 같다.

다만 조금 귀찮았다는 생각은 들었다.

'Camp > T.I.L.' 카테고리의 다른 글

[TIL #17] 롤케이크 자르기  (0) 2024.09.26
[TIL #16] 모음사전  (0) 2024.09.25
[TIL #14] k진수에서 소수 개수 구하기  (0) 2024.09.23
[TIL #13] 피로도  (0) 2024.09.20
[TIL #12] 의상  (0) 2024.09.12
'Camp/T.I.L.' 카테고리의 다른 글
  • [TIL #17] 롤케이크 자르기
  • [TIL #16] 모음사전
  • [TIL #14] k진수에서 소수 개수 구하기
  • [TIL #13] 피로도
BVM
BVM
  • BVM
    E:\
    BVM
  • 전체
    오늘
    어제
    • 분류 전체보기 (168)
      • Thoughts (14)
      • Study (69)
        • Japanese (3)
        • C++ & C# (46)
        • Javascript (3)
        • Python (14)
        • Others (3)
      • Play (1)
        • Battlefield (1)
      • Others (11)
      • Camp (73)
        • T.I.L. (57)
        • Temp (1)
        • Standard (10)
        • Challenge (3)
        • Project (1)
  • 블로그 메뉴

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

  • 공지사항

    • 본 블로그 개설의 목적
  • 인기 글

  • 태그

    discord py
    스타필드
    서버
    db
    Dalamud
    IOCP
    네트워크
    discord
    프로그래머스
    7계층
    Python
    FF14
    C++
    Network
    bot
    Server
    JS
    로깅
    cloudtype
    docker
    암호화
    boost
    OSI
    Asio
    c#
    베데스다
    포인터
    Selenium
    네트워크 프로그래밍
    클라우드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
BVM
[TIL #15] 주차 요금 계산
상단으로

티스토리툴바