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';
		}
	}
}