Programmers 42583

다리를 지나는 트럭

Posted by Damin on January 14, 2020

다리를 지나는 트럭

문제 링크

생각을 전환하면 쉽게 풀리는 문제 <- 이게 어렵다

순서대로 나가야 하기 때문에 queue를 활용

queue에는 무게, 시간 을 쌍으로 저장해준다.

이때, 시간을 시작 시간으로 하게 된다면 1초마다 queue에 있는 모든 시간을 다 늘려줘야 한다.

  • 불가능

따라서 queue에 원래 끝나야 하는 시간을 넣어줘서 queue의 앞에 것만 체크해 주면서 끝내자.

남은 트럭 = 벡터

다리 = queue 로 생각하자

생각해야 할 조건

1
2
3
4
5
6
7
1.	다리에도 없고, 남은 트럭도 없는 경우
2.	다리에만 있는 경우 (벡터에 값이 없을 때)
3.	남은 트럭이 있는 경우
  A.	다리에 있는 경우
    -	시간 다 된 것이 있으면 빼줘야 한다.
  B.	다리의 무게가 다음 트럭을 버틸 수 있다면 넣기
    -	버티지 못한다면 맨 앞의 것을 빼기

Code

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> p;

int solution(int len, int w, vector<int> t) {
    queue<p> q;
    int answer = 1;
    int siz = t.size();
    int i = 0;
    while(1){
        int nowTime = answer;
        if(!q.size() && i == siz){ // 다리에도 없고, 남은 트럭도 없는 경우
            break;
        }
        if(i == siz){ // 다리에만 있는 경우
                int tempTime = q.front().first;
                answer = tempTime;
                q.pop();
        }
        else // 남은 트럭이 있는 경우
        {
            if(q.size()) // 다리에 있는 경우
            {
                int tempTime = q.front().first;
                int tempW = q.front().second;
                if(nowTime == tempTime){ // 시간 다 된거 빼주기
                    q.pop();
                    w += tempW;
                }
            }
            if(t[i]<=w){ // 버틸 수 있다면 넣기
            w -= t[i];
            p temp = make_pair(nowTime + len,t[i]);
            q.push(temp);
            i++;
            answer++;
        }
         else{ // 그 time에 버틸 수 없다면 빼기
             int tempTime = q.front().first;
             answer = tempTime;
             w += q.front().second;
             q.pop();
         }
        }
    }
    return answer;
}