프로그래머스에서 다리를 지나는 트럭 문제를 해결했다.
어떻게 해결했는지 모르겠다... 계속 오류가 생기다가 변수 증가를 좀 수정하고 이것 저것 손대고 마지막에 다리길이를 더하니 정답이 나왔다. 마지막 트럭이 나온 후 다리를 지나야 하니까 다리길이를 더하는게 맞지만 맞았다는 출력문에 어벙벙했다.
- 답인 answer 을 시간으로 취급해서 계산했다.
- bridge_truck에 현재 다리에 있는 트럭을 추가했다. 탐색을 하는 중 제거를 하게 되면 포인터 참조오류가 나서 그냥 다리를 빠져 나올 트럭이 있을경우 pop의 값을 증가시켜서 나중에 한꺼번에 제거했다.
- total은 현재 다리위에 있는 총 트럭들의 무게합이다.
#include <string>
#include <vector>
#include <list>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0;
list<pair<int, int>> bridge_truck;
int total = 0;
for (int i = 0; i < truck_weights.size(); i++) {
//트럭을 못 올릴 경우
while (total + truck_weights[i] > weight) {
answer++;
list<pair<int, int>>::iterator iter;
int pop = 0;
for (iter = bridge_truck.begin(); iter != bridge_truck.end(); iter++) {
(*iter).first++;
if ((*iter).first == bridge_length) {
total -= (*iter).second;
pop++;
}
}
//따로 전부 삭제
for (int i = 0; i < pop; i++) {
bridge_truck.pop_front();
}
}
answer++;
list<pair<int, int>>::iterator iter;
int pop = 0;
for (iter = bridge_truck.begin(); iter != bridge_truck.end(); iter++) {
(*iter).first++;
if ((*iter).first == bridge_length) {
total -= (*iter).second;
pop++;
}
}
for (int i = 0; i < pop; i++) {
bridge_truck.pop_front();
}
bridge_truck.push_back(make_pair(1, truck_weights[i]));
total += truck_weights[i];
}
answer += bridge_length;
return answer;
}
'프로그래밍 > 코딩테스트 문제' 카테고리의 다른 글
[프로그래머스] 프린터 (0) | 2020.03.24 |
---|---|
[프로그래머스] 쇠막대기 (0) | 2020.03.24 |
[프로그래머스] 위장문제 (0) | 2019.10.28 |
[프로그래머스] 타켓넘버 (0) | 2019.10.13 |
[프로그래머스] 베스트 앨범 (0) | 2019.10.13 |