주차 요금 계산

eunheelog·2023년 6월 2일
0

programmers

목록 보기
2/15

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

문제 요약


  • 어떤 차량이 입차한 후 출차하지 않았다면 23:59 출차로 간주
  • 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간 계산 후 요금을 일괄 정산
  • 누적 주차 시간 ≤ 기본 시간 일 때
    기본 요금
  • 누적 주차 시간 ≥ 기본 시간 일 때
    기본 요금 + 초과한 시간에 대한 단위 시간 당 요금
    (초과시간이 나누어 떨어지지 않으면 올림)
  • 주차 요금 fee
0123
기본 시간기본 요금단위 시간단위 요금
  • 입출차 내역 record
    → "시각 차량번호 내역"
    1. 시각은 HH:MM
    2. 차량번호는 숫자 4자리
    3. 내역은 IN, OUT (입차인지 출차인지)

💡Idea

  1. 시간을 어떻게 계산할까?
    → 분으로 통일하기 ! (시간 * 60 + 분)
  2. 입/출차되는 차량을 어떤 자료구조로 저장할까?
    → 처음에 queue로 저장하려고 했지만 queue는 탐색이 불가함.
    → 탐색이 가능한 map을 선택
  3. 출차되지 않은 차량은 23:59로 계산하기

Source Code

#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

int calc_money(int time, vector<int> fees) {
    if(time <= fees[0]) {
        return fees[1];
    }
    else {
        int sum = ceil(double (time - fees[0]) / fees[2]) * fees[3];
        return fees[1] + sum;
    }
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    map <string, int> car, money; // 차량번호, 입차 시간 / 차량번호, 요금
    for(int i=0; i<records.size(); i++) {
        int time = stoi(records[i].substr(0, records[i].find(":"))) * 60;
        time += stoi(records[i].substr(records[i].find(":") + 1, 2));
        string number = records[i].substr(records[i].find(" ") + 1, 4);
        records[i] = records[i].substr(records[i].find(" ") + 6);
       
        if(records[i] == "IN") { // 입차된 경우
            car.insert(make_pair(number, time));
        }
       
        else { // 출차할 경우
            int sum = time - car[number];
            if(money.find(number) != money.end()) { // 이전에 이용한 차량
                money[number] += sum;
            }
            else {
                money.insert({number, sum});
            }
            car.erase(car.find(number));
        }
    }
   
    for (pair<string, int> now : car) { // 출차되지 않은 차량
        int time = 23 * 60 + 59 - now.second;
        if(money.find(now.first) != money.end()) {
            money[now.first] += time;
        }
        else {
            money.insert({now.first, time});
        }
    }
   
    for (pair<string, int> fee : money) {
        answer.push_back(calc_money(fee.second, fees));
    }
   
    return answer;
}

Feedback


  1. 한 문제 푸는 데 꽤 많은 시간을 소비하였음.
    → 타이머 재고 풀어보기 !
profile
⛧1일 1알고리즘⛧

0개의 댓글