2021. 3. 5. 16:40ㆍ알고리즘/프로그래머스
1. 문제
일차선의 다리의 길이, 다리가 견딜 수 있는 무게가 주어진다.
트럭이 주어진 순서대로 1초에 다리 길이 1 만큼 움직인다고 할때
최소 걸리는 시간을 구하여라.
2. 자료구조 queue
제한 무게 10인 다리에 트럭이 다음과 같은 순서로 온다고 해보자
7, 4, 5, 6
그럼 다음과 같이 나타낼 수 있다
7 | |||||||
7 | 0 | ||||||
7 | 0 | 4 | |||||
7 | 0 | 4 | 5 | ||||
7 | 0 | 4 | 5 | 0 | |||
7 | 0 | 4 | 5 | 0 | 6 | ||
7 | 0 | 4 | 5 | 0 | 6 | 0 | |
7 | 0 | 4 | 5 | 0 | 6 | 0 | 0 |
답: 8 |
빨간색 이 다리위에 있는 트럭들을 보여준다.
결과로 나오는 배열 7, 0, 4, 5, 0, 6, 0, 0
의 크기가 정답이 됨을 알 수 있다.
그러므로 주어진 순서에 맞게 큐에 집어넣으면서 만약 무게가 초과되면 0인 더미 값을 집어넣고 길이가 초과되면 pop하면 정답을 쉽게 얻어낼 수 있다.
하지만 이런 방식은 느리다. 그리고 0 인 더미를 연속으로 집어 넣는건 비효율적이다.
3. 건너뛰기
-큐에 더미의 정보를 압축하여 pair에 저장한다. 이는 결과 배열의 인덱스 값 + 1 과 같다. 즉, 결과 배열의 해당 위치를 저장하는것
-그러면 더미를 추가하는 작업없이 트럭의 개수가 n 이면 O(n)번의 검사만에 끝을 낼 수 있다.
-트럭무게 벡터 마지막에 다리 가 견딜 수 있는 값을 추가하면 맨 끝원소까지 자연스럽게 문제를 해결할 수 있다.
-맨 앞 트럭이 마지막 다리를 건널때 POP해주는것을 잊지말자 ( 길이 초과)
- move = bridge_length - (answer - thisPos) : 결과배열과 다리를 나가는 지점까지 상대적 위치를 계산한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int answer = 0, capa = 0, move = 0;
queue<pair<int, int> > q;
truck_weights.push_back(weight);
for(int i = 0; i < truck_weights.size(); i++)
{
bool isMove = false;
while(capa + truck_weights[i] > weight )
{
capa -= q.front().second;
move = bridge_length - (answer - q.front().first);
answer += move;
q.pop();
isMove = true;
}
if((!q.empty())&&(1 == bridge_length - (answer - q.front().first)))
{
capa -= q.front().second;
q.pop();
}
if(!isMove) answer++;
capa += truck_weights[i];
q.push(make_pair(answer, truck_weights[i]));
}
return answer;
}
|
cs |
programmers.co.kr/learn/courses/30/lessons/42583
github.com/Nor-s/Algorithm/blob/master/programmers/Trucks.cpp
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [C++] 가장 먼 노드 (bfs) (0) | 2021.03.09 |
---|---|
[프로그래머스] [C++] 타겟 넘버 (dp, dfs) (0) | 2021.03.09 |
[프로그래머스] [C++] 체육복 (네트워크 플로, 탐욕법) (0) | 2021.03.06 |
[프로그래머스] [C++] 더 맵게 (queue, heap) (0) | 2021.03.05 |
[프로그래머스] [C++] 완주하지 못한 선수 (map) (0) | 2021.03.05 |