programmers.co.kr/learn/courses/30/lessons/42583
다리의 길이, 다리가 견딜 수 있는 무게, 트럭들의 무게가 주어질 때 모든 트럭이 다리를 건너려면 몇 초가 걸리는지 반환해야한다.
1. 트럭은 int[] truck_weights의 순서대로 움직인다.
2. 트럭은 1초에 1만큼 이동한다.
3. 다리에 올라간 트럭의 무게의 합은 다리가 견딜 수 있는 무게 이하여야한다.
풀이 .
import java.util.LinkedList;
import java.util.Queue;
class Truck {
int location;
int weight;
Truck(int location, int weight) {
this.location = location;
this.weight = weight;
}
}
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
Queue<Truck> tQue = new LinkedList<Truck>();
Queue<Truck> bQue = new LinkedList<Truck>();
for(int w : truck_weights) {
tQue.add(new Truck(0, w));
}
int cnt = 0; // 다리를 통과한 트럭 개수
int time = 0;
int currentWeight = 0;
while(cnt < truck_weights.length) {
time++; // 반복 한 번 당 1초
// 다리 위 트럭 한 칸 씩 이동
for(Truck t : bQue) {
t.location++;
}
// 다 건넌 트럭 제거
if(!bQue.isEmpty() && bQue.peek().location > bridge_length) {
currentWeight -= bQue.poll().weight;
cnt++;
}
if(!tQue.isEmpty() && // 더 들어갈 트럭이 있는가?
bQue.size() < bridge_length && // 다리에 들어갈 자리가 있는가?
currentWeight + tQue.peek().weight <= weight) { // 다리가 무게를 감당할 수 있는가?
tQue.peek().location++;
currentWeight += tQue.peek().weight;
bQue.add(tQue.poll());
}
}
answer = time;
return answer;
}
}
트럭의 위치를 표시하기 위해 class Truck을 만들었다.
다리에 올라가기 전 모든 트럭의 location은 0이다.
1. 다리 위 모든 트럭들의 한 칸 전진
2. 다리를 건넌 트럭이 있다면 제거
3. 트럭이 새로 들어올 수 있다면 추가
nullpointerexception이 여러 번 떠서 찾느라 애를 먹었다.
처음 코딩할 때부터 nullpointer를 감안해서 짤 수 있었으면 좋겠는데 잘 안 된다.
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
[PG] 더 맵게 JAVA (0) | 2020.12.31 |
---|---|
[PG] 프린터 JAVA (0) | 2020.12.30 |
[PG] 기능 개발 JAVA (0) | 2020.12.28 |
[PG] 주식 가격 JAVA (0) | 2020.12.28 |
[PG] 베스트 앨범 JAVA (0) | 2020.12.28 |