http://school.programmers.co.kr/learn/courses/30/lessons/42583
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
문제 설명
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.
예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.
| 경과 시간 | 다리를 지난 트럭 | 다리를 건너는 트럭 | 대기 트럭 |
| 0 | [] | [] | [7,4,5,6] |
| 1~2 | [] | [7] | [4,5,6] |
| 3 | [7] | [4] | [5,6] |
| 4 | [7] | [4,5] | [6] |
| 5 | [7,4] | [5] | [6] |
| 6~7 | [7,4,5] | [6] | [] |
| 8 | [7,4,5,6] | [] | [] |
따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.
solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
제한 조건
- bridge_length는 1 이상 10,000 이하입니다.
- weight는 1 이상 10,000 이하입니다.
- truck_weights의 길이는 1 이상 10,000 이하입니다.
- 모든 트럭의 무게는 1 이상 weight 이하입니다.
입출력 예
| bridge_length | weight | truck_weights | return |
| 2 | 10 | [7,4,5,6] | 8 |
| 100 | 100 | [10] | 101 |
| 100 | 100 | [10,10,10,10,10,10,10,10,10,10] | 110 |
문제 해결을 위한 과정
이 문제는 매 초마다 일어나는 변화를 코드로 큐를 이용해서 해결할 수 있습니다.
- 데이터 구조 설계: 다리 위 트럭의 현재 위치와 무게를 담을 Bridge static 클래스를 생성합니다.
- 두 개의 큐 활용:
- q1 (다리 위): 현재 다리 위에서 이동 중인 트럭들을 담습니다.
- q2 (대기 중): 아직 다리에 진입하지 못한 트럭들을 담습니다.
- 매 초 진행되는 로직:
- 이동: 다리 위 모든 트럭의 위치(pos)를 1씩 증가시킵니다. (q1의 트럭들 pos 값 증가)
- 탈출: 맨 앞 트럭의 위치가 다리 길이(bridge_length)에 도달하면 다리에서 내리고, 현재 다리 위 총 무게(sum)에서 해당 트럭 무게를 뺍니다.
- 진입: 대기 중인 다음 트럭이 다리의 무게 제한을 버틸 수 있다면, 새로운 트럭을 다리에 올리고 위치를 0으로 설정합니다.
소스코드
import java.util.*;
class Solution {
static class Bridge {
int pos;
int w;
public Bridge(int pos, int w) {
this.pos = pos;
this.w = w;
}
}
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 1;
int sum = 0;
int pass = 0;
Queue<Bridge> q1 = new LinkedList<>();
Queue<Integer> q2 = new LinkedList<>();
for(int i = 0; i < truck_weights.length; i++) {
q2.offer(truck_weights[i]);
}
int temp = q2.poll();
q1.offer(new Bridge(0, temp));
sum += temp;
while(pass != truck_weights.length) {
answer += 1;
// 기존 트럭 이동
for(int i = 0; i < q1.size(); i++) {
Bridge br = q1.poll();
q1.offer(new Bridge(br.pos + 1, br.w));
}
// 제일 끝에 도달한 트럭이 있으면 내리기
if(q1.peek().pos == bridge_length) {
Bridge br = q1.poll();
sum -= br.w;
pass += 1;
}
// 새로운 트럭 올릴 수 있는지 판단
if(!q2.isEmpty() && sum + q2.peek() <= weight) {
q1.offer(new Bridge(0, q2.peek()));
sum += q2.poll();
}
}
return answer;
}
}'알고리즘 > 프로그래머스' 카테고리의 다른 글
| 프로그래머스 프로세스 (Level 2 Java) (0) | 2026.03.15 |
|---|---|
| 프로그래머스 올바른 괄호 (Level2 Java) (0) | 2026.03.14 |
| 프로그래머스 기능개발 (Level2 Java) (0) | 2026.03.14 |
| 프로그래머스 같은 숫자는 싫어 (Level1 Java) (0) | 2026.03.14 |
| 프로그래머스 베스트앨범(Level 3 Java) (0) | 2026.03.12 |
