string
과 map
문제.. 알고리즘 자체는 어렵지 않은데 c++이라 헤맸다.. 파이썬 마렵네
stringstream
으로 공백 단위로 끊고 차량 번호가 key
, 입출차 기록이 value
가 되는 map
에 넣는다.map
을 돌리면서 입출차 기록이 홀수면 출차 기록이 없다는 뜻이므로 23:59
를 추가해주고 주차 시간을 분으로 바꿔주는 timeGap
함수로 주차 시간을 계산한다.timeGap
함수는 :
단위로 끊어주기 위해 stringstream
과 getline
을 이용하여 hour
와 minute
를 분리해주고 분으로 바꾼후 timeToMinute
에 넣어준다.timeToMinute
를 두 개 단위로 끊어 누적 주차 시간을 리턴한다.calculate
함수를 호출한다.ceil
(올림)을 사용해줘야 된다.map
은 자동 오름차 순 정렬이니 그대로 answer
에 넣어준다.#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <cmath>
using namespace std;
int calculate(vector<int> fees, int gap)
{
if(gap<=fees[0]) return fees[1];
float tmp = (gap-fees[0])/(float)fees[2];
return fees[1]+ceil(tmp)*fees[3];
}
int timeGap(vector<string> time)
{
vector<int> timeToMinute;
for(int i=0;i<time.size();i++)
{
string hour="";
string minute="";
stringstream stream(time[i]);
getline(stream, hour, ':');
getline(stream, minute, ':');
timeToMinute.push_back(stoi(hour)*60+stoi(minute));
}
int total = 0;
for(int i=0;i<timeToMinute.size();i+=2)
{
total += timeToMinute[i+1]-timeToMinute[i];
}
return total;
}
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
stringstream stream;
map<string,vector<string>> m;
for(int i=0;i<records.size();i++)
{
string car;
string time;
stream.str(records[i]);
stream>>time>>car;
m[car].push_back(time);
}
for(auto u:m)
{
if(u.second.size()%2==1) u.second.push_back("23:59");
int gap = timeGap(u.second);
answer.push_back(calculate(fees, gap));
}
return answer;
}