문제 설명
해결과정
Solution.java
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
// 총 소요시간
int answer = 0;
// 각 트럭별 다리 진입 시간
int[] entryTime = new int [truck_weights.length];
// 각 트럭별 다리 탈출 시간
// int[] escapeTime = new int [truck_weights.length];
Map<Integer, Integer> escapeTime = new HashMap<>();
// 각 트럭별 다리 이동 시간
int[] travelTime = new int [truck_weights.length];
// travelTime의 모든 요소들 bridge_length로 초기화
travelTime = initialTravelTime(travelTime, bridge_length);
// 현재 시간
int currentTime = 0;
// 현재 다리 위 트럭들의 총 무게
int totalWeights = 0;
// 현재 다리 위 트럭들의 대수
int numberOfTrucks = 0;
// 현재 트럭의 인덱스
int index = 0;
// 현재 트럭
int truck = 0;
// 트럭들의 다리 건너기 시작
while(index < truck_weights.length) {
// 매 반복문이 진행될 때 마다 현재 시간은 증가
currentTime++;
// 다리에 진입해야 할 트럭을 한 대 가지고 온다.
truck = truck_weights[index];
// 현재 트럭의 상태를 점검 다리를 지나간 트럭이 있는지 확인
// 어떻게?
// 현재 시간의 나가야 하는 트럭이 있는지 확인
if(escapeTime.containsKey(currentTime)) {
int i = escapeTime.get(currentTime);
int escapeTruck = truck_weights[i];
totalWeights -= escapeTruck;
numberOfTrucks -= 1;
escapeTime.remove(currentTime);
}
// 다리의 무게와 차량대수를 비교하여 현재 트럭이 진입이 가능한지 확인
if(totalWeights+truck <= weight && numberOfTrucks+1 <= bridge_length) {
// 현재 트럭이 다리에 진입한다.
// 무게 변경
totalWeights += truck;
// 대수 변경
numberOfTrucks += 1;
// 트럭의 진입 시간 변경
entryTime[index] = currentTime;
// 트럭의 탈출 시간, 인덱스 입력
escapeTime.put(currentTime+bridge_length , index);
// 다음 트럭 대기
index++;
}
}
answer = entryTime[truck_weights.length-1] + bridge_length;
return answer;
}
public int[] initialTravelTime(int[] travelTime, int bridge_length) {
for(int i = 0; i < travelTime.length; i++) {
travelTime[i] = bridge_length;
}
return travelTime;
}
}
Java
복사