문제
https://school.programmers.co.kr/learn/courses/30/lessons/42583
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 개요
트럭들이 순서대로 일차선 다리를 건너려 합니다. 다리는 최대 bridge_length대의 트럭을 동시에 수용할 수 있으며, 총 무게 weight만큼의 하중을 견딜 수 있습니다. 모든 트럭이 대기열 순서대로 다리를 건널 때 필요한 최소 시간을 구하는 문제입니다.
문제 풀이 개요
각 트럭이 다리를 건너는 상황을 시뮬레이션하여 풀이합니다. 다리를 건너는 트럭들을 큐에 저장하며 트럭이 다리를 통과할 때마다 시간을 증가시키고, 새로운 트럭이 올라갈 수 있는지를 계산합니다. 무게 제한을 초과하는 경우, 트럭 대신 빈 자리를 큐에 넣어 다리가 차 있는 상태를 유지합니다.
해결 과정
- 다리 상태를 큐로 표현하기
- bridge_length의 크기를 가지는 큐를 생성해 다리 위의 트럭을 관리합니다. 각 트럭이 다리를 건너기 시작할 때 큐에 추가되며, 시간이 지남에 따라 다리를 통과한 트럭은 큐에서 빠져나갑니다.
- 트럭 이동 시뮬레이션
- truck_weights의 트럭을 순서대로 큐에 추가해 이동을 시뮬레이션합니다.
- curW 변수를 통해 다리 위 트럭들의 현재 무게를 추적하며 새로운 트럭이 다리에 오를 수 있는지를 확인합니다. 트럭이 다리에 올라가면 curW에 해당 트럭의 무게를 더하고, 다리를 건너는 데 걸리는 시간을 증가시킵니다.
- 무게 초과 처리
- 다리 위 트럭의 무게와 새로운 트럭의 무게 합이 weight를 초과할 경우, 현재 트럭을 다리에 올릴 수 없으므로 큐에 0을 추가하여 대기합니다.
- 모든 트럭이 다리를 건넌 후 추가 시간 계산
- 모든 트럭이 다리에 올라간 후 다리를 완전히 빠져나가려면 bridge_length만큼의 시간이 더 필요합니다. 따라서 전체 시간을 계산할 때 마지막으로 트럭이 다리를 다 건너는 시간을 더합니다.
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
Queue<Integer> q = new LinkedList<>();
// 다리 길이만큼 0으로 초기화하여 대기열을 표현
for(int i = 0; i < bridge_length; i++) {
q.add(0);
}
int idx = 0; // 대기 중인 트럭의 인덱스
int curW = 0; // 현재 다리 위 트럭들의 무게 합
// 모든 트럭이 다리를 건널 때까지 반복
while (idx < truck_weights.length) {
// 다리를 다 건넌 트럭 무게 빼기
curW -= q.poll();
answer++;
// 다음 트럭을 다리에 올릴 수 있는지 확인
if (curW + truck_weights[idx] <= weight) {
q.add(truck_weights[idx]);
curW += truck_weights[idx];
idx++; // 다음 트럭으로 이동
} else {
q.add(0); // 무게 초과 시 빈 공간 유지
}
}
// 마지막 트럭이 다리를 완전히 건너는 시간 추가
return answer + bridge_length;
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 소수 찾기 - Java (0) | 2024.10.28 |
---|---|
[프로그래머스] 이중우선순위큐 - Java (0) | 2024.10.27 |
[프로그래머스] 의상 - Java (0) | 2024.10.25 |
[프로그래머스] 110 옮기기 - Java (3) | 2024.10.19 |
[프로그래머스] 인사고과- Java (0) | 2024.10.18 |