Programmers 다리를 지나는 트럭
문제 이해
정해진 하중을 버틸 수 있는 다리가 있고, 주어진 여러 트럭들이 순서대로 다리를 지나고자 한다.
각각의 트럭에는 정해진 무게가 있고, 다리가 버틸 수 있는 하중 안에서 트럭들이 다리 위에 오를 수 있다.
정수 길이의 다리가 주어지면 트럭은 1초에 1씩 이동할 수 있고, 모든 트럭이 다리를 건널 때 까지 걸리는 시간을 리턴하면 된다.
입출력 조건 확인
아직까지 조건 계산(시간 & 공간 복잡도)이 어려운 것 같다.
일단 반복문 하나로 처리하기 때문에 문제가 없을 것이라고 생각한다.
문제 풀이 내용 정리
다리의 크기만큼 큐에다가 빈 칸(-1)을 넣어줬다.
반복문이 실행될 때 마다 시간(time)을 1초씩 증가시킨다.
트럭이 다리에 오르면 큐에 트럭의 무게를 넣고 다리가 견디고 있는 하중(bridgeWeight)이 증가한다.
만약 다리가 견디고 있는 하중(bridgeWeight)과 진입하는 트럭의 무게를 더했을 때 다리가 버틸 수 있는 하중(weight)을 초과하는 경우 트럭은 진입하지 않고 빈 칸(-1)이 진입한다.
트럭이 다리를 건너면 다리가 견디고 있는 하중을 다리를 건넌 트럭의 무게만큼 빼준다.
마지막 트럭이 다리에 오르면 그 트럭이 나올 때 까지 1초에 한 번 poll을 진행하고 마지막 트럭이 다리를 건너면 반복문이 종료된다.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.Queue;
import java.util.LinkedList;
class Solution {
public static int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> bridgeQ = new LinkedList<>();
int[] result = new int[truck_weights.length];
int bridgeWeight = 0;
int time = 0;
int index = 0;
int tIndex = 0;
for (int i = 0; i < bridge_length; i++)
bridgeQ.offer(-1);
while (true) {
time++;
if (bridgeQ.peek() == -1)
bridgeQ.poll();
else {
bridgeWeight -= bridgeQ.peek();
result[tIndex] = bridgeQ.poll();
tIndex++;
}
if (index == truck_weights.length) {}
else if (bridgeWeight + truck_weights[index] <= weight) {
bridgeQ.offer(truck_weights[index]);
bridgeWeight += truck_weights[index];
index++;
} else
bridgeQ.offer(-1);
if (tIndex == truck_weights.length)
break;
}
return time;
}
}
코드 문제점 및 해결 방법
원래 도저히 여기에 큐를 적용할 방법을 몰라서 이틀을 생각만 했다. 사실 원래 하던 대로 그냥 막 했으면 바로 풀었을 것 같은데 결과적으로 큐를 사용한 방법으로 풀게 되어 뿌듯했다!
(원래 하려던 방법은 다리 길이 만큼 배열을 만들고 한 칸씩 이동시키는 직관적? 인 방법 ㅋㅋㅋㅋ 이젠 그만 해야해…)
Java의 특성을 살려 객체 지향으로 아름답게 푼 사람이 있는데 자세히는 안봤지만 다음에 문제를 풀 때 객체 지향적인 방향으로도 생각해볼 필요가 있을 것 같다.