https://school.programmers.co.kr/learn/courses/30/lessons/92341
주차장의 요금표와 차량이 들어오고 나간 기록이 주어진다.
차량별로 주차 요금을 계산하려고 한다.
어떤 차량이 입차 한 이후에 출차한 내역이 없다면 23시 59분에 출차한 것으로 한다.
00:00 ~ 23:59까지 입차 출차 내역을 통하여 일괄적으로 요금을 계산한다.
누적 주차시간이 기본 시간 이하라면 기본요금을 청구한다.
누적 주차시간이 기본시간을 초과하면 기본 요금에 더해서 초과한 시간에 대해서 단위 시간마다 단위 요금을 청구한다.
초과한 시간이 단위 시간으로 나누어 떨어지지 않으면 올림 연산한다.
주차 요금을 나타내는 fees 배열, 자동차의 입출 차 내역을 나타내는 문자열 배열 records
차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 리턴한다.
조건1. fees의 길이 = 4, 기본시간/기본요금/단위시간/단위요금
조건2. records의 각 원소는 시각/차량번호/내역 -> 시각은 HH:MM, 차량번호는 0~9로 구성된 네자리 문자열
조건3. records는 시각을 기준으로 오름차순으로 정렬되어 주어진다.
records를 돌면서 차가 주차한 시간을 저장한다.
IN이 들어오면 총 세가지의 정보를 저장해야한다.
1. 주차장에 차량이 들어와 있는지 아닌지에 대한 표시
2. 주차장에 차량이 들어온 시간
3. 주차장에 들어온 누적 시간 (처음 IN일 떄는 0으로 초기화)
이렇게해서 records를 모두 돌도나면 주차장에 차량이 있는지를 확인하여,
있다면, 마지막 차량이 들어온 시간과 23:59 시간에 차를 구하여 누적 시간에 값을 더해준다.
그리고 마지막으로 요금을 계산해주면 된다.
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <algorithm>
using namespace std;
int to_min(string s)
{
int t = s[0] - 48;
t=t*10;
t+=s[1] - 48;
t=t*60;
t+=(s[3]-48)*10;
t+=s[4]-48;
return t;
}
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
map<string,int> map;
vector<vector<int>> info;
int idx = 0;
for(int i=0;i<records.size();i++)
{
istringstream ss(records[i]);
string stringBuffer;
vector<string> s;
while(getline(ss,stringBuffer,' ')){
s.push_back(stringBuffer);
}
if(map.find(s[1]) == map.end())
{
map.insert(make_pair(s[1],idx));
idx++;
vector<int> v; // 주차장에 있는가?, 몇시에 들어왔는가?, 누적 시간
v.push_back(1);
v.push_back(to_min(s[0]));
v.push_back(0);
info.push_back(v);
}
else
{
int k = map[s[1]];
if(s[2] == "IN")
{
info[k][0] = 1;
info[k][1] = to_min(s[0]);
}
else
{
info[k][0] = 0;
int time = to_min(s[0]) - info[k][1];
info[k][2] += time;
}
}
}
int last = to_min("23:59");
for(int i=0;i<info.size();i++)
{
if(info[i][0] == 1)
{
info[i][2] += last - info[i][1];
}
}
for(auto iter=map.begin();iter!=map.end();iter++)
{
int x = info[(*iter).second][2];
if(x > fees[0])
{
x -= fees[0];
if(x%fees[2] == 0)
{
x = x/fees[2];
x = x*fees[3];
answer.push_back(fees[1]+x);
}
else
{
x = x/fees[2];
x++;
x = x*fees[3];
answer.push_back(fees[1]+x);
}
}
else
{
answer.push_back(fees[1]);
}
}
return answer;
}