본문 바로가기
Developer/C, C++

[C++] 프로그래머스 - 다리를 지나는 트럭 (스택/큐)

by Doony 2022. 1. 3.

프로그래머스 - 다리를 지나는 트럭 (스택/큐)를 풀어봤습니다. 역시나 다른 풀이에는 정말 간단히 푼 사람들이 많더군요. 저는 저만의 방식대로 일단 풀었다는데 의의를...


문제 설명



접근 방법

  • 해시를 통해 다리를 지나는 트럭이 몇 초 간 운행했는지를 기록. key는 트럭의 index 값, value는 경과 시간 (초).
  • 다리를 지나지 않은 트럭을 나타내는 큐를 2개 생성. 각각 트럭의 중량과, 트럭의 idx를 의미함.
  • while loop를 돌려서 매 초 카운트가 되게 한다.
  • 현재 다리 위에 있는 트럭들을 해시를 통해 찾고, 1초를 더한다. 만약 운행 시간이 다리의 길이와 같다면, 해시값을 수정해서 다 건넜다고 표시한다.
  • 만약 현재 다리 위에 있는 트럭의 무게와, 대기 중인 트럭 큐의 첫번째 트럭 중량의 합이 허용 범위 이내라면, 큐에서 pop한다.

다소 복잡하고 무식하지만 결과는 패스!


코드


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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <unordered_map>
 
 
using namespace std;
 
int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
    
    // crossing truckes counter.
    unordered_map<intint> ing;
    for (int i=0; i<truck_weights.size(); i++) {
        ing[i] = 0;
    }
    
    // add all trucks on Queue
    queue<int> q;
    for (auto z : truck_weights) {
        q.push(z);
    }
    // add all truck idx on Queue
    queue<int> q_idx;
    for (int i=0; i<truck_weights.size(); i++) {
        q_idx.push(i);
    }
    
    int crossing = 0;
    
    bool endCond = true;
    
    while(endCond) {
        
        // check if crossing truckes are done!
        for (int i=0; i<truck_weights.size(); i++) {
            if (ing[i] == bridge_length) {
                crossing -= truck_weights[i];
                ing[i] = 0;
            } else if (ing[i] != 0) {
                ing[i]++;
            }
        }
        
        // check if another crossing is ok.
        
        if (q.size() != 0 && crossing + q.front() <= weight) {
            crossing += q.front();
            ing[q_idx.front()]++;
            q.pop();
            q_idx.pop();
            
        }
        
        
        
        answer++;
        
        // check end condition. (if all ings are 0.)
        for (int i=0; i<truck_weights.size(); i++) {
            if (ing[i] != 0) {
                break;
            } 
            if (i == truck_weights.size()-1) {
                // end!!
                endCond = false;
            }
        }
        
    }
    
    
    return answer;
}
cs

댓글