직접 풀어보고 올리는 코드입니다. 지적이나 더 좋은 방향에 대한 댓글은 항상 환영합니다.
https://school.programmers.co.kr/learn/courses/30/lessons/92341
생각의 흐름
우선 2개의 Map을 사용하게 된다.
unordered_map과 map을 사용하게 되는데, map같은 경우 차량 번호의 오름차순으로 결과를 출력해야하기 때문에 사용하였다.
그 외에 주차 시작시간을 저장하는 경우 정렬을 할 필요가 없으니 unordered_map을 사용할 것 이다.
우선 다음과 같은 입력을 받는다고 해보자.
"05:34 5961 IN",
"06:00 0000 IN",
"06:34 0000 OUT",
"07:59 5961 OUT",
"07:59 0148 IN",
"18:59 0000 IN",
"19:09 0148 OUT",
"22:59 5961 IN",
"23:00 5961 OUT"
공백을 기준으로 나눠서, 각각을 time, num, inout 이라는 변수에 담았다.
이후 차량이 주차된 시작 시간을 unordered_map을 통해 저장한다.
start_time_vec["5961"] = "05:34"
그다음 "06:00 0000 IN" 이 입력되면, 다음과 같이
start_time_vec["0000"] = "06:00" 이 저장된다.
이번에는 "06:34 0000 OUT" 이 입력되는데 출차 하기 때문에 주차시간을 계산하여 저장해야 한다.
이때 다음 calculateDiffTime 메서드를 이용한다.
int calculateDiffTime(string start, string end) {
int start_minute = to_minute(start);
int end_minute = to_minute(end);
return end_minute - start_minute;
}
이렇게 계산된 요금을 cost_time_vec에 저장시킨다.
cost_time_vec["0000"] += calculateDiffTime(start_time, end_time);
이런식으로 출차할때 시간을 전부 합쳐 논 후,
마지막에 총 주차시간을 기준으로 전부 가격을 계산하여 반환시켜주면 된다.
나의 코드
#include <bits/stdc++.h>
using namespace std;
unordered_map<string, string> start_time_vec;
map<string, int> cost_time_vec;
vector<int> vec;
int to_minute(string num) {
int h = stoi(num.substr(0, 2));
int m = stoi(num.substr(3, 2));
return h * 60 + m;
}
int calculateDiffTime(string start, string end) {
int start_minute = to_minute(start);
int end_minute = to_minute(end);
return end_minute - start_minute;
}
int calculateFee(int time) {
if (time <= vec[0]) {
return vec[1];
} else {
int overTime = time - vec[0];
int overCost = overTime % vec[2] == 0 ? (overTime / vec[2]) * vec[3] : ((overTime / vec[2]) + 1) * vec[3];
return vec[1] + overCost;
}
}
vector<int> solution(vector<int> fees, vector<string> records) {
vec = fees;
vector<int> answer;
for (auto e: records) {
stringstream ss(e);
string time, num, inout;
ss >> time >> num >> inout;
if (inout == "IN") {
start_time_vec[num] = time;
} else {
string &startTime = start_time_vec[num];
cost_time_vec[num] += calculateDiffTime(startTime, time);
start_time_vec.erase(num);
}
}
for(auto e : start_time_vec) {
cost_time_vec[e.first] += calculateDiffTime(start_time_vec[e.first], "23:59");
}
for (auto e: cost_time_vec) {
int &costTime = cost_time_vec[e.first];
int fee = calculateFee(costTime);
answer.push_back(fee);
}
return answer;
}
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스][C++] 코딩 테스트 공부 (249) (0) | 2022.09.27 |
---|---|
[프로그래머스][C++] 등산코스 정하기 (248) (1) | 2022.09.26 |
[프로그래머스][C++] 파괴되지 않은 건물 (247) (1) | 2022.09.22 |
[프로그래머스][C++] 순위 검색 (244) (0) | 2022.09.19 |
[프로그래머스][C++] 후보키 (243) (1) | 2022.09.15 |
댓글