프로그래머스/lv2/92341. 주차 요금 계산 2022 KAKAO BLIND RECRUITMENT

SITY·2023년 10월 30일
0

Cpp_Algorithm

목록 보기
37/43

#include <string>
#include <vector>
#include <map>
#include <sstream>
#include <cmath>
using namespace std;


int get_stayed_time(map<string, string> cars, string carNum, string out) {
    string in = cars[carNum];
    int in_time = stoi(in.substr(0, 2)) * 60 + stoi(in.substr(3, 2));
    int out_time = stoi(out.substr(0, 2)) * 60 + stoi(out.substr(3, 2));
    return out_time - in_time;
}

int get_price(int stayed_time, vector<int> fees) {
    if (stayed_time <= fees[0]) return fees[1];
    double c = double(stayed_time - fees[0]) / fees[2];
    return fees[1] + ceil(c) * fees[3];
}

vector<int> solution(vector<int> fees, vector<string> records) {
    vector<int> answer;
    map<string, int> stayed_time;
    map<string, string> cars;
    string num, time, act;
    for (int i = 0; i < records.size(); i++) {
        stringstream ss(records[i]);
        ss >> time >> num >> act;
        if (act == "IN") {
            cars[num] = time;
        } else if (act == "OUT") {
            stayed_time[num] += get_stayed_time(cars, num, time);
            cars.erase(num);
        }
    }
    for (auto it = cars.begin(); it != cars.end(); it++)
        stayed_time[it->first] += get_stayed_time(cars, it->first, "23:59");

    for (auto it = stayed_time.begin(); it != stayed_time.end(); it++)
        answer.push_back(get_price(it->second, fees));

    return answer;
}

차가 들어올 때는 차량 번호와 들어간 시간을 저장하는 Cars에 할당하고,
차가 나갈 때는 차량 번호와 머무른 시간을 저장하는 stayed_time에 총 머무른 시간을 저장한다.
그리고 차가 나간다면 차량이 들어올 때 저장했던 Cars에서 삭제한다.

만약 Cars의 사이즈가 1 이상이라면, 나가지 않은 차가 있다는 것이므로, 23:59분 시간 기준으로 할당해서 머무른 시간을 계산한다.
출력 조건은 차량 번호가 작은 순서대로 계산하는 것이므로 stayed_time 또한 Map을 사용했다.
기본 요금 + ⌈(머무른 시간 - 기본 시간) / 단위 시간⌉ x 단위 요금을 계산하는 함수를 사용하여 answer에 시간을 할당해준다.

profile
·ᴗ·

0개의 댓글