풀이 과정
records가 문자열로 주어졌기 때문에 어렵게 느낄 수 있다.
그래서 reco라는 이중벡터를 만들어 시간, 차량번호, INOUT을 따로 넣어줬다.
차량 번호가 key이고 시간이 value인 map을 만든다.
IN일 때는 map에 값을 넣어주고, OUT일 때는 현재 시각과 처음 들어온 시각을 빼준다.
그리고 출차 표시를 해주기 위해 map에서 그 차량번호는 지워준다.
그럼에도 불구하고 map에 남아있는 차량은 출차 기록이 없다는 것이다.
그럼 23:59분에서 입차 시간을 빼주면 된다.
최종적으로 주차 시간에 따른 요금 계산을 해주면 된다.
풀이 1
#include <string>
#include <vector>
#include <cmath>
#include <map>
using namespace std;
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
vector<vector<string>> reco;
for(int i = 0; i < records.size(); i++){
vector<string> temp;
string res = "";
for(int j = 0; j < records[i].size(); j++){
if(records[i][j] == ' '){
temp.push_back(res);
res = "";
}
else res += records[i][j];
}
if(res != "") temp.push_back(res);
reco.push_back(temp);
}
map<string, string> m; // 차량 번호, 시간
int sum[10000] = {0};
for(int i = 0; i < reco.size(); i++){
if(reco[i][2] == "IN"){
m[reco[i][1]] = reco[i][0];
}
else if(reco[i][2] == "OUT"){
int endH = stoi(reco[i][0].substr(0, 2));
int endM = stoi(reco[i][0].substr(3, 2));
int startH = stoi(m[reco[i][1]].substr(0, 2));
int startM = stoi(m[reco[i][1]].substr(3, 2));
int time = 60 * (endH - startH) + endM - startM;
sum[stoi(reco[i][1])] += time;
m.erase(reco[i][1]);
}
}
// 나간 기록이 없다면
for(auto iter : m){
int startH = stoi(iter.second.substr(0, 2));
int startM = stoi(iter.second.substr(3, 2));
int time = 60 * (23 - startH) + 59 - startM;
sum[stoi(iter.first)] += time;
}
// 주차 시간에 따른 주차 요금 계산
for(int i = 0; i < 10000; i++){
int res = fees[1];
if(sum[i]){
if(sum[i] > fees[0]){
sum[i] -= fees[0];
res += ceil((double)sum[i] / fees[2]) * fees[3];
}
answer.push_back(res);
}
}
return answer;
}
풀이 2
#include <string>
#include <vector>
#include <map>
using namespace std;
vector<int> solution(vector<int> fees, vector<string> records) {
vector<int> answer;
vector<vector<string>> reco;
for(int i = 0; i < records.size(); i++){
vector<string> temp;
string res = "";
for(int j = 0; j < records[i].size(); j++){
if(records[i][j] == ' '){
temp.push_back(res);
res = "";
}
else res += records[i][j];
}
if(res != "") temp.push_back(res);
reco.push_back(temp);
}
map<string, string> m; // 차량 번호, 시간
int sum[10000] = {0};
for(int i = 0; i < reco.size(); i++){
if(reco[i][2] == "IN"){
m[reco[i][1]] = reco[i][0];
}
else if(reco[i][2] == "OUT"){
int endH = stoi(reco[i][0].substr(0, 2));
int endM = stoi(reco[i][0].substr(3, 2));
int startH = stoi(m[reco[i][1]].substr(0, 2));
int startM = stoi(m[reco[i][1]].substr(3, 2));
int time = 60 * (endH - startH) + endM - startM;
sum[stoi(reco[i][1])] += time;
m.erase(reco[i][1]);
}
}
// 나간 기록이 없다면
for(auto iter : m){
int startH = stoi(iter.second.substr(0, 2));
int startM = stoi(iter.second.substr(3, 2));
int time = 60 * (23 - startH) + 59 - startM;
sum[stoi(iter.first)] += time;
}
// 주차 시간에 따른 주차 요금 계산
for(int i = 0; i < 10000; i++){
int res = fees[1];
if(sum[i]){
if(sum[i] > fees[0]){
sum[i] -= fees[0];
// 올림 함수(ceil) 구현
res += (sum[i] / fees[2]) * fees[3];
if(sum[i] % fees[2] != 0) res += fees[3];
}
answer.push_back(res);
}
}
return answer;
}
'🍞 Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스][Level2] 타겟 넘버 c++ (0) | 2022.10.21 |
---|---|
[프로그래머스][Level2] 짝지어 제거하기 c++ (0) | 2022.10.21 |
[프로그래머스][Level2] 전화번호 목록 c++ (0) | 2022.10.21 |
[프로그래머스][Level2] 올바른 괄호 c++ (0) | 2022.10.21 |
[프로그래머스][Level2] 땅따먹기 c++ (0) | 2022.10.21 |