📄 문제
주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.
요금표
기본 시간(분) 기본 요금(원) 단위 시간(분) 단위 요금(원)
180 5000 10 600
입/출차 기록
시각(시:분) 차량 번호 내역
05:34 5961 입차
06:00 0000 입차
06:34 0000 출차
07:59 5961 출차
07:59 0148 입차
18:59 0000 입차
19:09 0148 출차
22:59 5961 입차
23:00 5961 출차
자동차별 주차 요금
차량 번호 누적 주차 시간(분) 주차 요금(원)
0000 34 + 300 = 334 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600
0148 670 5000 +⌈(670 - 180) / 10⌉x 600 = 34400
5961 145 + 1 = 146 5000
어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.
초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
⌈a⌉ : a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림을 의미합니다.
주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.
📝 풀이
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int getMin(string format)
{
return stoi(format.substr(0, 2)) * 60 + stoi(format.substr(3, 2));
}
struct parkInfo
{
int parkingTime;
int totalTime;
};
vector<int> solution(vector<int> fees, vector<string> records) {
map<string, parkInfo> m;
for (string s : records)
{
int min = getMin(s.substr(0, 5));
bool isIn = s[11] == 'I';
string carNo = s.substr(6, 4);
// 이미 값이 있다면?
if (m.find(carNo) != m.end())
{
if (m[carNo].parkingTime != -1)
{
m[carNo].totalTime += (min - m[carNo].parkingTime);
m[carNo].parkingTime = -1;
}
else
{
m[carNo].parkingTime = min;
}
}
else
{
m[carNo].totalTime = -fees[0];
m[carNo].parkingTime = min;
}
}
vector<int> answer;
for (pair<string, parkInfo> p : m)
{
int cost = fees[1];
if (p.second.parkingTime != -1)
p.second.totalTime += (getMin("23:59") - p.second.parkingTime);
if (p.second.totalTime > 0)
cost += ceil(p.second.totalTime / (float)fees[2]) * fees[3];
answer.push_back(cost);
}
return answer;
}
- getMin 함수를 이용하여 시간을 분단위로 변환하여 리턴합니다.
- 각 입력을 검사하여 map에 차 번호를 기준으로 정렬하여 삽입합니다.
- 만약 처음 입차한다면, m에 새롭게 값을 씁니다.
- m에 값이 있는 상태에서 parkingTime(현재 주차 시간)이 -1 아니라면, 현재 입차해있는 상태이므로 출차하는 경우로, totalTime을 계산하여 갱신합니다.
- 입력이 끝나면 foreach에서 오름차순으로 하나씩 검사하여 answer에 정답을 삽입합니다.
'algorithms (C++)' 카테고리의 다른 글
[C++][프로그래머스] 마법의 엘리베이터 (0) | 2023.11.06 |
---|---|
[C++][프로그래머스] 피로도 (0) | 2023.11.06 |
[C++][프로그래머스] 양궁대회 (0) | 2023.11.05 |
[C++][프로그래머스] 두 큐 합 같게 만들기 (1) | 2023.11.04 |
[C++][프로그래머스] 이모티콘 할인행사 (0) | 2023.11.04 |