본문 바로가기

코딩테스트

[코딩테스트] 다리를 지나는 트럭

문제


풀이

#include <string>
#include <vector>

using namespace std;

struct T_truck_weights
{
	T_truck_weights() {}
	T_truck_weights(int truck)
	{
		truck_weights = truck;
		this->count = 1;
	}

	int truck_weights;
	int count;
};

int solution(int bridge_length, int weight, vector<int> truck_weights) {
	int answer = 0;
	int maxWeight = 0;
	vector<T_truck_weights> t_truck_weights;

	/*
	1. 다리에 올라가있는놈들 진행시키기
	2. 다리에 올라갈 트럭이있는지 검사
	3. 다리에 트럭올리기
	*/

	for (;;)
	{
		for (int i = 0; i < t_truck_weights.size(); i++) // 다리에 올라간 트럭만큼 반복한다.
		{
			if (t_truck_weights[i].count == bridge_length) // 트럭이 다리에 갯수만큼 건너갔는지 체크한다.
			{
				maxWeight -= t_truck_weights[i].truck_weights; // 다리를 건넌 트럭의 무개를 제거한다.
				t_truck_weights.erase(t_truck_weights.begin() + i); // 다리를 지나간 트럭을 제거한다.
				i = -1;
			}
			else
				t_truck_weights[i].count++; // 다리에 올라간 트럭들의 count를 증가시킨다.
		}

		if (truck_weights.empty() && t_truck_weights.empty()) // 올라갈 트럭이 존재하지 않고
		{
			answer++;
			return answer;
		}

		if (!truck_weights.empty() && maxWeight + truck_weights[0] <= weight) // 현재 올라갈 트럭이 남아있고 다리에 내가 트럭을 한대더 올려도 무게가 남는다면 다리에 트럭을 추가한다.
		{
			t_truck_weights.emplace_back(T_truck_weights(truck_weights[0]));
			maxWeight += truck_weights[0];
			truck_weights.erase(truck_weights.begin() + 0);
		}

		answer++;
	}

	return answer;
}

'코딩테스트' 카테고리의 다른 글

[코딩테스트] 타겟 넘버  (0) 2021.08.20
[코딩테스트] 체육복  (0) 2021.08.13
[코딩테스트] 두 정수의 합  (0) 2021.08.12
[코딩테스트] 기능개발  (0) 2021.08.08
[코딩테스트] 부족한 금액 계산하기  (0) 2021.08.06