본문 바로가기

프로그래머스(Java)/Level 2

[프로그래머스] 다리를 지나는 트럭

728x90

코드 힌트

  1. 트럭 객체 사용하기
    • Truck 클래스를 사용해 각 트럭의 무게와 다리에서 남은 이동 거리를 관리합니다. 이 클래스를 통해 트럭이 다리에서 언제 빠져나가는지를 계산할 수 있습니다.
  2. 현재 다리 위의 트럭 상태 관리
    • List를 사용하여 다리 위에 있는 트럭들을 순서대로 관리합니다. 리스트의 각 요소는 트럭 객체로, 이들이 다리를 이동하는 과정을 추적합니다.
    • 매 초마다 트럭들의 남은 이동 거리를 줄이며, 다리를 완전히 건넌 트럭은 리스트에서 제거하고, 다리 위의 현재 무게를 감소시킵니다.
  3. 새로운 트럭 진입 처리
    • 새로운 트럭이 다리에 진입할 수 있는지 확인합니다. 다리의 현재 무게와 비교하여 트럭이 진입 가능한 경우 리스트에 추가하고, 다리 위의 트럭들을 이동시킵니다.
    • 만약 현재 대기 중인 트럭이 다리의 무게 제한을 초과하면, 기존 트럭들이 다리를 더 지나갈 때까지 대기합니다.
  4. 모든 트럭의 이동 완료 처리
    • 마지막 트럭이 다리에 진입한 후, 다리 위의 모든 트럭이 건너기까지의 시간을 추가로 계산하여 결과에 반영합니다.
    • 마지막 트럭의 남은 이동 거리를 result에 추가하여 최종 시간을 계산합니다.

 


정답은 더보기 클릭

더보기
class Truck {
    int weight; // 트럭의 무게를 저장하는 변수
    int remainingLength; // 트럭이 다리 위에서 이동해야 할 남은 거리를 저장하는 변수
    
    // 트럭 객체를 초기화하는 생성자
    Truck(int w, int l) {
        weight = w;
        remainingLength = l;
    }
}

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int result = 0; // 모든 트럭이 다리를 건너는 데 걸리는 총 시간을 저장하는 변수
        int currentWeight = 0; // 현재 다리 위에 있는 트럭들의 총 무게를 저장하는 변수
        
        List<Truck> list = new ArrayList<>(); // 다리 위에 있는 트럭들을 관리하는 리스트
        for (int w : truck_weights) {
            
            // 현재 대기 중인 트럭이 다리를 건널 수 있을 때까지 반복
            while (currentWeight + w > weight) {
                // 다리 위에 있는 트럭이 1씩 이동하고 시간 추가
                for (int i = list.size()-1; i >= 0; i--) {
                    Truck t = list.get(i);
                    t.remainingLength--; // 트럭의 남은 이동 거리를 1 줄임
                    if (t.remainingLength == 0) { // 트럭이 다리를 모두 건넜을 경우
                        currentWeight -= t.weight; // 다리의 현재 무게에서 해당 트럭의 무게를 제거
                        list.remove(t); // 리스트에서 트럭을 제거
                    }
                }
                result ++; // 시간 증가
            }
            
            // 다음 트럭이 다리를 건너기 시작
            list.add(new Truck(w, bridge_length)); // 트럭을 리스트에 추가하여 다리 건너기 시작
            // 다리 위 트럭 1씩 이동하기
            for (int i = list.size()-1; i >= 0; i--) {
                Truck t = list.get(i);
                t.remainingLength--; // 트럭의 남은 이동 거리를 1 줄임
                if (t.remainingLength == 0) { // 트럭이 다리를 모두 건넜을 경우
                    currentWeight -= t.weight; // 다리의 현재 무게에서 해당 트럭의 무게를 제거
                    list.remove(t); // 리스트에서 트럭을 제거
                }
            }
            // 다음 트럭 무게 추가
            currentWeight += w; // 현재 다리의 무게에 새로운 트럭의 무게를 추가
            result++; // 시간 증가
        }
        
        // 모든 트럭이 다리를 건너기 시작했다면 현재 가장 뒤에 있는 트럭 남은 길이를 result 추가
        result += list.get(list.size()-1).remainingLength + 1;
        return result; // 총 걸린 시간 반환
    }
}
728x90