Baekjoon/Gold
C++ / 백준 / 21942 / 부품 대여장
GitHubSeob
2022. 4. 12. 19:03
문제
https://www.acmicpc.net/problem/21942
21942번: 부품 대여장
첫 번째 줄에 부품 대여장에 작성된 정보의 개수 $N$, 대여기간 $L$, 벌금 $F$이 공백으로 구분되어 주어진다. 대여기간 형식은 DDD/hh:mm으로 DDD는 일, hh는 시간, mm은 분을 의미한다. (000/00:00 는 주어
www.acmicpc.net
문제풀이
날짜와 시간을 입력받으면 모두 분으로 바꾼다.
string을 substr을 이용하여 각각 월, 일, 시, 분을 파싱 하고 stoll을 통해 long long으로 형 변환을 한다.
map을 이용한다. key부분은 pair을 이용해 {이름, 부품}을 입력받고, value에는 시간을 입력받는다.
map[{이름, 부품}]값이 비어있으면 빌린 시간을 분으로 계산하여 집어넣는다.
비어있지 않으면 입력받은 시간에서 map[{이름, 부품}] 값인 빌린 시간을 빼어 answer[이름]에 더한다.
answer이 비어있으면 -1, 비어있지 않으면 answer의 모든 값을 출력한다.
값이 클 수 있으므로 int가 아닌 long long형 변수를 선언하였고,
한 사람이 대여시간을 여러 번 넘겨 벌금을 누적할 수 있는 점과
한 사람이 같은 물건을 여러 번 빌릴 수 있는 것 같다. (초기화를 하지 않았더니 48%에서 '틀렸습니다'가 떴다)
코드
#include <iostream>
#include <vector>
#include <map>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int N(0), F(0);
string L("");
string input("");
string name(""), part("");
int idx(0);
long long month(0), day(0), hour(0), min(0);
vector<long long>cal = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
for (idx = 1; idx <= 12; ++idx)
cal[idx] += cal[idx - 1];
cin >> N >> L >> F;
map<pair<string, string>, long long>list;
map<string, long long>answer;
long long period(0);
long long start(0), end(0), time(0);
period = stoll(L.substr(0, 3)) * 24 * 60 + stoll(L.substr(4, 2)) * 60 + stoll(L.substr(7, 2));
for (idx = 0; idx < N; ++idx) {
cin >> input;
month = stoll(input.substr(5, 2));
day = stoll(input.substr(8, 2));
cin >> input;
hour = stoll(input.substr(0, 2));
min = stoll(input.substr(3, 2));
cin >> part;
cin >> name;
time = cal[month - 1] * 24 * 60 + day * 24 * 60 + hour * 60 + min;
if (list[{name, part}] == 0) {
list[{name, part}] = time;
}
else {
end = time;
start = list[{name, part}];
list[{name, part}] = 0;
if (end - start > period) {
answer[name] += ((end - start - period) * F);
}
}
}
if (answer.empty()) cout << -1;
else {
for (auto iter = answer.begin(); iter != answer.end(); ++iter) {
cout << iter->first << " " << iter->second << '\n';
}
}
}