문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42583
문제 설명
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.
solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
제한사항
- bridge_length는 1 이상 10,000 이하입니다.
- weight는 1 이상 10,000 이하입니다.
- truck_weights의 길이는 1 이상 10,000 이하입니다.
- 모든 트럭의 무게는 1 이상 weight 이하입니다.
풀이 순서 (이 문제는 Queue를 이용해 풀어야 한다고 생각한다.)
2-5번 과정 반복(종료 조건: 4번)
- 이동해야하는 트럭을 Queue(var: q)에 담는다.
- 트럭은 1초에 1만큼 움직인다. (While 반복문)
- 최초 이동거리가 1 시작한다고 가정하면, 트럭은 bridge_length+1 만큼 이동해야한다.
- 다리에 트럭이 이동 가능할 경우, 이동 중 트럭 List(var: l)에 넣어준다.
- 이동 중 트럭 List에서 이동을 마친 트럭은 이동 중 트럭 List에서 제외시킨다.
- 조건 1) 이동해야하는 트럭 Queue가 비었는지, 조건 2) 이동 중인 트럭 List가 비었는지 검사 (두 조건 만족 = 종료)
- 이동해야하는 트럭이 있으면, 현재 트럭의 총 무게(var: total) + 이동 예정 트럭의 무게(var: cur)를 weight와 비교.
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
ArrayList<Node> l = new ArrayList<>();
Queue<Integer> q = new LinkedList<>();
for (int i = 0; i < truck_weights.length; i++) {
q.add(truck_weights[i]);
}
int time = 0;
int total = 0;
while (true) {
ArrayList<Node> tmp = new ArrayList<>();
// 이동 중 트럭 +1만큼 이동시키기.
for (int i = 0; i < l.size(); i++) {
l.get(i).move += 1;
// 이동 중인 트럭
if (l.get(i).move < bridge_length + 1) {
tmp.add(new Node(l.get(i).w, l.get(i).move));
} else { // 이동이 끝난 트럭
total -= l.get(i).w;
}
}
// 초기화 및 이동 중인 트럭List 갱신
l = new ArrayList<>();
l = tmp;
time += 1;
// 종료 조건
if ((l.size() == 0) && q.isEmpty()) {
break;
}
if (!q.isEmpty()) {
int cur = q.peek();
// 이동해야하는 트럭
if (total + cur <= weight) {
q.poll();
l.add(new Node(cur, 1));
total += cur;
}
}
}
answer = time;
return answer;
}
static class Node {
int w, move;
Node(int w, int move) {
this.w = w;
this.move = move;
}
}
}
'Algorithm' 카테고리의 다른 글
[프로그래머스 - 정렬] H-Index (0) | 2020.01.27 |
---|---|
[프로그래머스 - 정렬] 가장 큰수 (0) | 2020.01.27 |
[프로그래머스 - 해시] 베스트앨범 (0) | 2020.01.27 |
[프로그래머스 - 완전탐색] 숫자야구 (0) | 2020.01.27 |
[프로그래머스 - 완전탐색] 소수찾기 (0) | 2020.01.27 |