https://school.programmers.co.kr/learn/courses/30/lessons/92341
stringstream으로 먼저 파싱하는데 : 를 제거하고 시, 분, 차번호, IN or OUT
이렇게 4개로 나누어서 파싱하였다. IN을 만나면 rec에 등록하고 OUT을 만나면 rec의 기록과 비교해서 시간을 구해서 Fees에 더해준다.
OUT을 못만난 값은 23:59를 적용시켜 다시한번 더해준다.
키값이 차번호이므로 정렬되어있으므로 차례대로 요금을 계산해서 answer에 넣어준다.
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;
int Fee(int a, int b, int c, int d, int num)
{
int fee = b;
num -= a;
if(num <= 0)
return fee;
fee += d * (num % c ? num/c + 1 : num/c);
return fee;
}
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
for(int i = 0; i < records.size(); i++)
{
for(int j = 0; j < records[i].length(); j++)
if(records[i][j] == ':')
{
records[i][j] = ' ';
break;
}
}
// IN일때 rec에 등록, OUT일 때 rec에 등록된 시간 비교해서 Fees에 등록
map<int, int> rec;
map<int, int> Fees;
// 파싱하면서 IN이면 rec에 등록, OUT이면 시간 계산해서 Fees에 등록
for(string s : records)
{
int hour;
int min;
int carnum;
string inout;
stringstream ss;
ss.str(s);
ss >> hour >> min >> carnum >> inout;
if(inout == "IN")
rec[carnum] = hour * 60 + min;
else if(inout == "OUT")
{
int f = hour * 60 + min;
f -= rec[carnum];
Fees[carnum] += f;
rec.erase(carnum);
}
}
// OUT이 없는 애들 23:59에 출차로 기록하기
for(auto r : rec)
{
int f = 23 * 60 + 59;
f -= r.second;
Fees[r.first] += f;
}
// 이제 검출해낸 시간으로 계산하기
for(auto f : Fees)
answer.push_back(Fee(fees[0],fees[1],fees[2],fees[3],f.second));
return answer;
}
#include <bits/stdc++.h>
using namespace std;
int conv(string& t) {
int h = (t[0] - 48) * 10 + t[1] - 48;
int m = (t[3] - 48) * 10 + t[4] - 48;
return h * 60 + m;
}
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> vec[10000];
for (auto& record : records)
{
stringstream ss(record);
string a, b, c;
ss >> a >> b >> c;
vec[stoi(b)].push_back(conv(a));
}
vector<int> ans;
for (int i = 0; i < 10000; ++i) if (!vec[i].empty())
{
if (vec[i].size() & 1) vec[i].push_back(23 * 60 + 59);
int sum = 0;
for (int j = 1; j < vec[i].size(); j += 2) sum += vec[i][j] - vec[i][j - 1];
int val = fees[1];
if (sum > fees[0]) val += (sum - fees[0] + fees[2] - 1) / fees[2] * fees[3];
ans.push_back(val);
}
return ans;
}
파싱을 string으로 하여 시간을 통째로 검출하고 차번호와 IN or OUT 3개로 분해했다.
시간은 OO:OO형태이므로 이것에 맞춰서 계산했다.
int형 벡터를 10000개를 선언해두고 파싱한 시간값을 모두 넣었다.
그 후 사이즈가 홀수인 벡터 ( OUT이 없었던 것 )에 23:59를 넣어준다.
그 후 값을 계산해서 ans에 넣어주었다.