본문 바로가기
알고리즘/프로그래머스

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

by 오이가지아빠 2021. 3. 22.

스택과 큐를 사용해서 풀어야 하는 문제지만 ArrayList를 사용하여 다리위 상태를 구현하고,

트럭이 올라가고 내려가는 것을 계산하여 알맞게 loadTruck, unloadTruck 을 호출한다.

 

다리 위(BRIDGE class) 의 총 무게가 하중을 견딜수 있을만큼만 올려놓고

올려진 트럭이 탄 시간 + 다리위에 있는 시간을 계산하여 다리에서 내린다.

 

아직 타지 않은 트럭이 없으면 더 이상 loadTruck을 할 필요는 없어지고

최초상태를 제외하고 다리 위에 트럭의 무게가 0이라면 루프를 빠져나온다.

 

 

import java.util.*;
import java.util.stream.Collectors;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        List<Integer> list2 = Arrays.stream(truck_weights).boxed().collect(Collectors.toList());

        int totCnt = list2.size() * bridge_length + 1;
        BRIDGE bridge = new BRIDGE();
        int waitTruck = 0;
        int answer = 0;
        for(int i = 1; i <= totCnt; i++) {
            //System.out.println(i + "초");
            //System.out.println("원래 다리위에는 "+ bridge.truck + "총 무게:" + bridge.getAllWeight() );
            if(i == 1 ) {
                //System.out.println(list2.get(waitTruck)+"무게의 트럭을 다리에 올려");
                bridge.loadTruck(i, list2.get(waitTruck));
                waitTruck += 1;
            } else {
                // 건너편에 도착했으면 내린다
                if(bridge.truck.size() > 0) {
                    if (i == bridge.getFirstTruckLoadTime() + bridge_length) {
                        //System.out.println(bridge.truck.get(0)+"이 반대쪽에 도착함");
                        bridge.unloadTruck(0);
                    }
                }
                // 내리고 동시에 다리에 올라갈 수 있음
                if(waitTruck < list2.size()) {
                    if(bridge.getAllWeight() + list2.get(waitTruck) <= weight) {
                        //System.out.println(list2.get(waitTruck)+"무게의 트럭을 다리에 올려");
                        bridge.loadTruck(i, list2.get(waitTruck));
                        waitTruck += 1;
                    }
                }
                if(bridge.getAllWeight() == 0) {
                    answer = i;
                    break;
                }
            }
            //System.out.println("지금 다리위에는 "+ bridge.truck);
        }
        return answer;
    }

    static class BRIDGE {
        List<Map<Integer, Integer>> truck = new ArrayList<Map<Integer, Integer>>();

        public void loadTruck(int loadTime, int t) {
            Map<Integer, Integer> map = new HashMap<>();
            map.put(loadTime, t);
            truck.add(map);
        }
        
        public void unloadTruck(int t) {
            truck.remove(0);
        }

        public int getFirstTruckLoadTime() {
            int result = 0;
            Map<Integer, Integer> map = truck.get(0);
            Map.Entry<Integer, Integer> next = map.entrySet().iterator().next();
            return next.getKey();
        }

        public int getAllWeight() {
            int result = 0;
            for (Map<Integer, Integer> map : truck) {
                for (Integer value : map.values()) {
                    result += value;
                }
            }
            return result;
        }
    }

}

 

출처: 프로그래머스 코딩 테스트 연습, 
https://programmers.co.kr/learn/challenges

 

반응형

댓글