akjfal

프로그래머스 42583번 java 본문

알고리즘/programmers

프로그래머스 42583번 java

akjfal 2021. 1. 15. 01:33

Programmers 코딩테스트 level 2 - 42583번 다리를 지나는 트럭

java로 작성했습니다.


생각한 점

1. 다리에 현재 올라와있는 queue와 트럭이 대기중인 queue사용

2. 틱마다 다리에 트럭이 올라갈수있는지 없는지 체크해 대기중인 queue의 길이만큼 for문을 돌림

    static public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int line_weight = 0;
        int length = truck_weights.length;
        Integer[] tmp_bridge = new Integer[bridge_length];
        Arrays.fill(tmp_bridge, 0);
        // 다리를 지나갈 트럭이 대기하는 queue
        Queue<Integer> queue = new LinkedList<>();
        // 현재 다리에 트럭이 지나가는 queue
        Queue<Integer> queue_bridge = new LinkedList<>(Arrays.asList(tmp_bridge));
        for(int i = 0 ; i < truck_weights.length; i++){
            queue.add(truck_weights[i]);
        }
        for (int i = 0; i < length; i++) {
        // 트럭 한대가 들어갈 수 있을때까지 while문을 실행해줍니다. 
            while (true) {
                answer++;
                // 시간이 지났으므로 다리하중에서 1틱이 지났을때 빠지는 무게만큼 빼줍니다.
                line_weight -= queue_bridge.poll();
                // 현재 다리가 견디는 하중 + 다음 트럭 무게 <= 다리가 견딜수 있는 하중
                // 만약 true라면 다리로 트럭이 진입합니다.
                if (line_weight + queue.peek() <= weight) {
                    int add_num = queue.poll();
                    queue_bridge.add(add_num);
                    line_weight += add_num;
                    // 트럭이 진입하면 break
                    break;
                // false라면 0을 쌓아줍니다.
                } else {
                    queue_bridge.add(0);
                }
            }
        }
        //last truck out time
        answer += bridge_length;
        return answer;
    }
Comments