728x90
(1) 문제
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.
예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.
경과 시간다리를 지난 트럭다리를 건너는 트럭대기 트럭
0 | [] | [] | [7,4,5,6] |
1~2 | [] | [7] | [4,5,6] |
3 | [7] | [4] | [5,6] |
4 | [7] | [4,5] | [6] |
5 | [7,4] | [5] | [6] |
6~7 | [7,4,5] | [6] | [] |
8 | [7,4,5,6] | [] | [] |
따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.
solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
(2) 제한사항
- bridge_length는 1 이상 10,000 이하입니다.
- weight는 1 이상 10,000 이하입니다.
- truck_weights의 길이는 1 이상 10,000 이하입니다.
- 모든 트럭의 무게는 1 이상 weight 이하입니다.
(3) 코드
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
vector<pair<int, int>> vec;
int max_weight = weight;
int current_weight = 0;
while (!(truck_weights.empty() && vec.empty()))
{
current_weight = 0;
for (int i = 0; i < vec.size(); i++)
{
current_weight += vec[i].second;
}
if (!truck_weights.empty())
{
if (max_weight >= current_weight + truck_weights[0])
{
vec.push_back(make_pair(0, truck_weights[0]));
truck_weights.erase(truck_weights.begin());
}
}
for (int i = 0; i < vec.size(); i++)
{
vec[i].first++;
}
if (vec[0].first == bridge_length)
{
current_weight = current_weight - vec[0].second;
vec.erase(vec.begin());
}
answer++;
}
return answer + 1;
}
(4) 실행결과
반응형
'Programmers > C++' 카테고리의 다른 글
[프로그래머스] 코딩테스트 연습 > 힙 > 더 맵게 (C++) (0) | 2020.12.20 |
---|---|
[프로그래머스] 코딩테스트 연습 > 스택/큐 > 프린터(C++) (0) | 2020.12.14 |
[프로그래머스] 코딩테스트 연습 > 해시 > 베스트앨범(C++) (0) | 2020.12.14 |
[프로그래머스] 코딩테스트 연습 > 해시 > 위장(C++) (0) | 2020.12.14 |
[프로그래머스] 코딩테스트 연습 > 해시 > 전화번호 목록(C++) (0) | 2020.12.14 |