반응형
아 엄청 헤맨 문제.... 결국 풀이를 보고말았다...
다른분들은 아주 심플하게 푼것같다.
내 나름대로 정리를 해놓으려고 한다.
1). 우선 Class를 따로 빼서 관리할수 있도록 만든다.
무게와 진입시점을 담고있는 아이를 Queue에 넣어서 진행 시킬것!
class Truck {
int weight;
int entry;
Truck(int weight, int entry){
this.weight = weight;
this.entry = entry;
}
}
2). 여기서 중요한 부분은
기다리는 Truck Queue와 다리를 지나는 Truck Queue로 구분짓는다.
다리에 진입하는 시점의 시간을 트럭Class객체에 담아 queue에 넣어준다.
트럭의속도는 1임으로 시간이 지날때 지나가는 Queue에 있는 객체를 꺼내 다리를 지났는지 아닌지를 판별할 수 있다.
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Truck> waiting = new LinkedList<>();
Queue<Truck> bridge = new LinkedList<>();
//기다리는 트럭Queue 만들기
for(int i = 0 ; i < truck_weights.length ; ++i){
waiting.offer(new Truck(truck_weights[i], 0));
}
int time = 0;
int totalWeight = 0;
//기다리는 Queue가 비어있지않거나 다리Queue가 비어있지 않을동안.
while(!waiting.isEmpty() || !bridge.isEmpty()){
//시간흐름
time++;
//다리Queue가 비어있지 않을때
if(!bridge.isEmpty()) {
//트럭을 뽑아낸다.
Truck t = bridge.peek();
//만약 (총 시간 -트럭의진입시점)이 다리길이보다 크거나 같다면? => 트럭이 다리위에서 내려가야할때
if(time - t.entry >= bridge_length) {
totalWeight -= t.weight; //현재 다리위총 무게 - 현재 지나간 트럭 무게 해주기
bridge.poll(); //다리(Queue)에서 트럭을 제거
}
}
//기다리는 Queue가 비어있지 않을때
if(!waiting.isEmpty()) {
//만약 총 무게 + 기다리는 큐 첫번쨰 무게가 총무게 weight보다 작거나 같을때만
if(totalWeight + waiting.peek().weight <= weight) {
//기다리는 트럭Queue에서 Truck 하나 빼서 다리위를 통과시켜 주자.
Truck t = waiting.poll();
totalWeight += t.weight;
//다리위에 올려주자.
bridge.offer(new Truck(t.weight, time));
}
}
}
return time;
}
이상하게 알고리즘을 풀때면 여유를 갖고 생각하지못하고 마음만 급하다...
반응형
'Java > Algorithm' 카테고리의 다른 글
[Java-Algorithm] 백준 4307 개미 -그리디 알고리즘 (0) | 2021.05.24 |
---|---|
[Java-Algorithm] 백준 5585 거스름돈 -그리디 알고리즘 (0) | 2021.05.21 |
[Java-Algorithm] BFS 넓이 우선탐색 알고리즘이란? 인접리스트 (0) | 2021.04.26 |
[Java-Algorithm] DFS 깊이 우선탐색 알고리즘이란? 인접리스트 그래프 (0) | 2021.04.21 |
[Java-Algorithm] 이진탐색 알고리즘 (0) | 2021.03.03 |