주차요금계산 바로가기
1번문제와 비슷해서 매우 간단한문제
우리는 map을 만들어야하는데
이거랑,
0202 16:00 18:00
3961 16:00 18:00 23:58
이 map을 만들어야한다
우선 map을 사용해야하는이유는 애초에 answer반환형이 오름차순이기 때문에 애초에 carnumber를 넣을때 map을 사용하면 자동으로 오름차순이된다.
map<string,vector> record;
map<string,int> fee;
1번 파싱해서 record에 넣기
for(int i=0;i<records.size();i++){
string tmp = records[i];
string time = tmp.substr(0,5); //05:34
string carNumber = tmp.substr(6,4); //5961
record[carNumber].push_back(time);
}
2번 파싱한거 시간계산하기
for(auto & pair : record){
string carNumber = pair.first;
int total = 0;
vector<string> & v = pair.second;
int x = 0;
int y = 0;
for(int i=0;i<v.size();i++){
if(i%2==0){
x=makeInt(v[i]);
}else{
y=makeInt(v[i]);
total += (y-x);
x=0;
y=0;
}
}
if(v.size() % 2 !=0){
y = makeInt("23:59");
total +=(y-x);
}
fee[carNumber] = total;
}
우선 carNumber를 가져오고 second가 vector니까 vector를 돈다.
핵심은 어차피 짝수는 무조건 입차고 홀수는 무조건 출차이다. 그래서 짝수 번째의 string이 10:00이면 이걸 가지고 int 숫자로 바꾸고 홀수 번째의 string이 12:00 이면 int로 바꿔서 total에다가 더해주고 초기화한다.
그런데 중요한게 만약 v.size()가 홀수라면 마지막으로 입차하고 안나간놈이있어서 이걸 마지막에 계산해줘야한다.
3번. makeInt
int makeInt(string time){
string hour = time.substr(0,2);
string min = time.substr(3,2);
return stoi(hour)*60+stoi(min);
}
간단하게 파싱을해주고 hour는 60을 곱하고 min은 그냥 더하면된다.
4번. fee를 돌면서 계산하면된다.
for(auto & pair : fee){
cout<<pair.first<<": "<<pair.second<<"\n";
int time = pair.second;
if(time<=fees[0]){
answer.push_back(fees[1]);
}else{
double a = (double)(time-fees[0])/fees[2];
int b = (time-fees[0])/fees[2];
int tmp=0;
if(a-b>0){tmp=b+1;}else{
tmp = b;
}
answer.push_back(fees[1]+tmp*fees[3]);
}
}
그냥 수식대로 구현을 하면되는데 핵심은 double로 캐스팅 (double)로 하나 받고 하나는 int로 받아서 뺀값이 0보다크면 소수가있다는거니까 0보다크면 +1 해줘서 올려주고 아니면 그냥 그대로 썻다.
정답코드
#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
map<string,vector<string>> record;
map<string,int> fee;
int makeInt(string time){
string hour = time.substr(0,2);
string min = time.substr(3,2);
return stoi(hour)*60+stoi(min);
}
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
for(int i=0;i<records.size();i++){
string tmp = records[i];
string time = tmp.substr(0,5);
string carNumber = tmp.substr(6,4);
record[carNumber].push_back(time);
}
for(auto & pair : record){
string carNumber = pair.first;
int total = 0;
vector<string> & v = pair.second;
int x = 0;
int y = 0;
for(int i=0;i<v.size();i++){
if(i%2==0){
x=makeInt(v[i]);
}else{
y=makeInt(v[i]);
total += (y-x);
x=0;
y=0;
}
}
if(v.size() % 2 !=0){
y = makeInt("23:59");
total +=(y-x);
}
fee[carNumber] = total;
}
for(auto & pair : fee){
cout<<pair.first<<": "<<pair.second<<"\n";
int time = pair.second;
if(time<=fees[0]){
answer.push_back(fees[1]);
}else{
double a = (double)(time-fees[0])/fees[2];
int b = (time-fees[0])/fees[2];
int tmp=0;
if(a-b>0){tmp=b+1;}else{
tmp = b;
}
answer.push_back(fees[1]+tmp*fees[3]);
}
}
return answer;
}