알고리즘/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;
}