https://programmers.co.kr/learn/courses/30/lessons/92341

 

코딩테스트 연습 - 주차 요금 계산

[180, 5000, 10, 600] ["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"] [14600, 34400, 5000]

programmers.co.kr

 

 

1. 차 번호를 key, 해당 차량이 드나든 시간 vector를 value로 갖는 car변수에 차 번호와 시간정보 저장

2. 차 번호와 해당 차량의 요금 정보를 pair로 갖는 carNum에 (차 번호, 0) 의 값을 pair로 저장

3. car에 담긴 시간 정보를 바탕으로 총 이용시간 산출

4. 산출된 시간정보를 바탕으로 feeCal함수를 사용하여 요금 정보 산출

5. 산출된 요금 정보를 carNum의 second value로 입력

6. 해당 값을 answer vector에 push_back

 

// 주차장에 머무른 총 시간을 계산하는 함수
int timeCal(string t, string tn) {
	int result=0;
	int h = stoi(t.substr(0, 2));
	int m = stoi(t.substr(3, 2));
	int hn = stoi(tn.substr(0, 2));
	int mn = stoi(tn.substr(3, 2));

	result = ((hn - h)*60) + (mn - m);
	return result;
}

// 시간 정보를 받아 요금을 계산하는 함수
int feeCal(int baseTime, int baseFee, int unitTime, int unitFee, int time) {
	int result=0;
	if (time > baseTime) {
		if((time - baseTime) % unitTime != 0)
			return (((time - baseTime) / unitTime)+1) * unitFee + baseFee;
		else
			return ((time - baseTime) / unitTime) * unitFee + baseFee;
	}
	else
		return baseFee;
}

vector<int> solution(vector<int> fees, vector<string> records) {
	vector<int> answer;
	map<string, vector<string>> car;
	set<pair<string, int>> carNum;	

	for (auto i : records) {
		car[i.substr(6, 4)].push_back(i.substr(0, 5));
		carNum.insert(make_pair(i.substr(6, 4), 0));
	}
	
	for (auto i : carNum) {
		string s = i.first;
		int x = car[s].size();
		if (x % 2 != 0)
			car[s].push_back("23:59");
	}

	for (auto i : carNum) {
		string s = i.first;
		int t = 0;
		for (int j = 0; j < car[s].size()-1; j+=2) {
			int time = timeCal(car[s][j], car[s][j + 1]);
			t += time;
		}
		answer.push_back(feeCal(fees[0], fees[1], fees[2], fees[3], t));
	}
	return answer;
}

https://programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ "2016-09-15 20:59:57.421 0.351s", "2016-09-15 20:59:58.233 1.181s", "2016-09-15 20:59:58.299 0.8s", "2016-09-15 20:59:58.688 1.041s", "2016-09-15 20:59:59.591 1.412s", "2016-09-15 21:00:00.464 1.466s", "2016-09-15 21:00:00.741 1.581s", "2016-09-1

programmers.co.kr

 

예제 1과 2의 차이를 명확하게 인지

** 처리시간은 시작시간과 끝 시간을 '포함'하므로

2016-09-15 01:00:04.002 2.0s

 1:00:02.003 부터 1:00:04.002 까지 

!! 1:00:02.002 부터가 아님! 끝난 시간에서 처리 시간을 빼고 0.001ms를 더해줘야 시작시간이 됨 !!

(h + m + s + ms - duration + 1)

 

이것만 알면 나머진 간단

2중 포문을 통해 시작 시간과 끝 시간을 비교하면서 끝 시간이 시작 시간보다 넘는다면, 즉, 겹친다면

해당 시간에 처리되는 프로세스의 개수를 1 증가

 

그렇게 나온 값들 중 가장 큰 값을 answer에 넣고 출력 (max함수)

int solution(vector<string> lines) {
	int answer = 0;
	vector<string> temp = lines;
	vector<int> start;
	vector<int> end;



	for (int i = 0; i < temp.size();i++) {
		int h, m, s, ms;
		float duration;
		temp[i].pop_back();
		h = stoi(lines[i].substr(11, 2)) * 3600 * 1000;
		m = stoi(lines[i].substr(14, 2)) * 60 * 1000;
		s = stoi(lines[i].substr(17, 2)) * 1000;
		ms = stoi(lines[i].substr(20, 3));
		duration = stof(lines[i].substr(24, 5)) * 1000;
		start.push_back(h + m + s + ms - duration + 1);
		end.push_back(h + m + s + ms);
	}

	for (int i = 0; i < lines.size();i++) {
		int end_t = end[i] + 1000;
		int cnt = 1;
		for (int j = i + 1; j < lines.size();j++) {
			int current_t = start[j];
			if (end_t > current_t) {
				cnt++;
			}
		}
		answer = max(answer, cnt);

	}
	return answer;
}

 

+ Recent posts