programmers 다리를 지나는 트럭
어제 세탁이 끝나기를 기다리며 읽어봤던 문제인데요. 처음엔 쉽다고 생각했습니다. 그 때는 고려해야할 변수들이 많이 안 보였거든요. 근데 막상 구현을 하려니 생각보다 변수들이 많더라구요.
현재 다리 무게, 대기 트럭, 다리 위의 트럭, 경과 시간
그래서 문제를 풀다가 이것저것 추가하다보니 되게 지저분해진 것 같아요. 다른 사람들은 어떻게 풀었는지 궁금하네요. 우선 제가 풀었던 방식을 코드로 살펴볼께요.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> before = new LinkedList();
LinkedList<Integer> middle = new LinkedList<>();
int answer = 0; // 경과 시간
int curWeight = 0; // 다리 무게
int truckIndex = 0; // 트럭 무게 알기위함
for (int i = 0; i < truck_weights.length; i++) {
before.offer(truck_weights[i]);
}
while (true) {
answer++;
// 거리 증감부터 하는 이유는 트럭 추가 후 바로 거리 증가를 막기위함
if (!middle.isEmpty()) {
for (int i = 0; i < middle.size(); i++) {
middle.set(i, middle.get(i) + 1); // 다리 위 트럭 모두 거리 +1 증가
}
// 모두 증가시키고 이후에 비교하여야함. 안 그러면 poll() 때문에 인덱스 변경 발생
if (middle.getFirst() == bridge_length) {
middle.poll();
curWeight -= truck_weights[truckIndex];
truckIndex++; // 트럭이 들어온 순서대로 빠지기 때문에 차례로 인덱스 늘려주면 됨
}
}
// 트럭 추가
if (!before.isEmpty() && curWeight + before.peek() <= weight) {
curWeight += before.poll();
middle.offer(0); // 트럭 다리 위에 추가시 거리 0으로 추가
}
if (middle.isEmpty()) { // 다리 위에 트럭 아무것도 없을 때 종료
break;
}
}
return answer;
}
}
다른 사람들도 Queue를 이용하여 다양한 방식으로 푸셨더라구요. 그리고 많은 분들이 객체지향적으로 Truck
이라는 클래스를 생성하고 moving()
매서드를 이용하여 푸셨더라구요. 물론 객체지향을 제대로 구현하는 것은 어렵지만 사람의 생각과 비슷한 구조라 확실히 코드가 눈에 잘 보이고 상태값도 명확하게 잘 보이는 것 같아요. 뭐 경시대회라면 모르겠지만 입사테스트까지는 이렇게 설계하는 것도 괜찮지 않을까요?
'Algorithm > problem solving' 카테고리의 다른 글
Today's Algorithm(2018-10-30) (0) | 2018.10.30 |
---|---|
Today's Algorithm(2018-10-29) (0) | 2018.10.29 |
Today's Algorithm(2018-10-25) (0) | 2018.10.25 |
Today's Algorithm(2018-10-22) (0) | 2018.10.22 |
Today's Algorithm(2018-10-20) (0) | 2018.10.20 |