주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
요금표
입/출차 기록
자동차별 주차 요금
어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
- 0000
번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
누적 주차 시간이 기본 시간
이하라면, 기본 요금
을 청구합니다.
누적 주차 시간이 기본 시간
을 초과하면, 기본 요금
에 더해서, 초과한 시간에 대해서 단위 시간
마다 단위 요금
을 청구합니다.
- 초과한 시간이 단위 시간
으로 나누어 떨어지지 않으면, 올림
합니다.
- ⌈a⌉
: a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림
을 의미합니다.
주차 요금을 나타내는 정수 배열 fees
, 자동차의 입/출차 내역을 나타내는 문자열 배열 records
가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <cmath>
using namespace std;
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
map<int, pair<int, int>> parking;
map<int, int> price;
for(string record : records) {
record[2] = ' ';
stringstream stream;
stream.str(record);
int num;
vector<int> temp;
while(stream >> num) temp.emplace_back(num);
if(parking.find(temp[2]) != parking.end()) {
int entrance = parking[temp[2]].first * 60 + parking[temp[2]].second;
int exit = temp[0] * 60 + temp[1];
int time = exit - entrance;
price[temp[2]] += time;
parking.erase(temp[2]);
}
else parking[temp[2]] = {temp[0], temp[1]};
}
for(auto it = parking.begin(); it != parking.end(); it++) {
int entrance = it->second.first * 60 + it->second.second;
int exit = 23 * 60 + 59;
int time = exit - entrance;
price[it->first] += time;
}
for(auto it = price.begin(); it != price.end(); it++) {
if(it -> second <= fees[0]) answer.emplace_back(fees[1]);
else answer.emplace_back(fees[1] + ceil(((float)(it->second-fees[0])/(float)fees[2])) * fees[3]);
}
return answer;
}
일단, 문제 조건이 너무 길다.
간단히 추려보면 다음과 같다.
- 차량의 누적 주차 시간(입차~출차)으로 정산함
- 차량의 출차 기록이 없으면 23:59에 출차한 것으로 간주함
- 누적 주차 시간이 기본 시간보다 작은 경우
기본 요금
이 부과됨- 누적 주차 시간이 기본 시간보다 큰 경우
기본 요금 + ⌈(누적 주차 시간 - 기본 시간) / 단위 시간⌉ * 단위 요금
이 부과됨
차량 번호와 입출차 시간을 알기 위해 stringstream
을 이용해서 정수만 뽑아냈고, map
에 입차 시간을 저장했다.
시간 계산을 편하게 하기 위해 00:00을 기준으로 흐른 시간을 계산했다(시간 * 60 + 분
)
출차한 경우 누적 시간 계산 후 map에서 해당 차량의 입차 기록 제거.
이렇게 하면 map에 남은 차량은 23:59에 출차한 것으로 간주하고 누적 시간을 계산할 수 있다.