스택과 큐를 사용해서 풀어야 하는 문제지만 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
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] (정렬) 가장 큰 수 (0) | 2021.03.25 |
---|---|
[프로그래머스] (스택/큐) 프린터 (0) | 2021.03.23 |
[프로그래머스] (스택/큐) 기능개발 (0) | 2021.03.23 |
[프로그래머스] (스택/큐) 주식가격 (0) | 2021.03.22 |
[프로그래머스] (정렬) K번째 수 (0) | 2021.03.22 |
댓글