728x90
문제
https://programmers.co.kr/learn/courses/30/lessons/42583
풀이
트럭의 무게와 트럭이 다리 위에 올라간 후 경과한 시간(초)를 멤버 변수로 갖는Truck이라는 클래스를 만들고,
Queue<Truck> bridge = new LinkedList<>();
Queue<Truck> trucks = new LinkedList<>();
Truck 객체를 갖는 큐를 2개 만들어서 필요한 애들을 꺼내서 쓰고 비교하고 암튼 그렇게 하려고 했는데 어디서 자꾸 에러가 났다 ㅠㅠㅠㅠ
그래서 시간 안에 풀려고 클래스를 사용하지 않는 풀이로 풀었음 !
쉽게쉽게 생각하려고 해야겠다!
그냥 다리 위(bridge 큐)에 올라가는 무게를 그때그때 더하거나 빼줬음!
다리에 공간은 있으나 무게가 초과되어서 못올라갈 경우 다리(bridge 큐)에 0을 offer() 해줘서 실제론 다리에 트럭이 올라가진 않았지만 올라간 것처럼 트릭을 써줌 -> 이게 이 풀이에서 제일 포인트 !!
마지막에 다리 길이 만큼 더해줌!
자세한건 주석으로!
코드
// 코딩테스트 연습 - 스택/큐 - 다리를 지나는 트럭
// https://programmers.co.kr/learn/courses/30/lessons/42583
package PROGRAMMERS.level2;
import java.util.LinkedList;
import java.util.Queue;
public class Num42583_다리를지나는트럭 {
private static class Solution {
private int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> bridge = new LinkedList<>();
int weightSum = 0; // 현재 다리 위 트럭의 무게의 합
int time = 0; // 전체 시간
for (int truckWeight : truck_weights) {
while (true) {
if (bridge.isEmpty()) { // 다리 위에 트럭이 한 대도 없는 경우
bridge.offer(truckWeight); // 다리에 트럭 진입
weightSum += truckWeight; // 방금 올라간 트럭만큼의 무게 추가
time++; // 시간++
break;
} else if (bridge.size() >= bridge_length) { // 다리의 길이보다 더 많은 트럭이 올라갈 수 없음.
weightSum -= bridge.poll(); // 다리가 꽉 차면 다리에서 트럭 한 대 빼고, 무게도 빼줌
} else { // 다리에 트럭이 올라갈 공간은 있는 경우(꽉 차진 않은 경우)
// 현재 다리 위 트럭들의 무게와 다음에 올라갈 트럭의 무게의 합이
// 최대 하중을 넘지 않는 경우
if (weightSum + truckWeight <= weight) {
bridge.offer(truckWeight); // 다리에 올림
weightSum += truckWeight; // 무게도 증가
time++; // 시간++
break;
} else { // 총 무게 때문에 다리 올리가지 못할 경우
bridge.offer(0); // 0을 다리 위에 올려줌으로써 한 칸을 차지하게 만듦
time++; // 시간++
}
}
}
}
// 마지막 트럭이 다리에 올라가면 for문이 끝나므로, 마지막 트럭이 다리를 빠져나가는 시간을 + 해줌
int answer = time + bridge_length;
return answer;
}
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.solution(2, 10, new int[]{7, 4, 5, 6}));
System.out.println(sol.solution(100, 100, new int[]{10}));
System.out.println(sol.solution(100, 100, new int[]{10, 10, 10, 10, 10, 10, 10, 10, 10, 10}));
}
}
}
728x90