🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📝 문제 설명
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.
solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.
⚠️ 제한 사항
- bridge_length는 1 이상 10,000 이하입니다.
- weight는 1 이상 10,000 이하입니다.
- truck_weights의 길이는 1 이상 10,000 이하입니다.
- 모든 트럭의 무게는 1 이상 weight 이하입니다.
✨ 내 코드
import java.util.ArrayDeque;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
ArrayDeque<Integer> wait = new ArrayDeque<>();
for (int i = 0; i < truck_weights.length; i++) {
wait.addLast(truck_weights[i]);
}
// 다리(size가 bridge_length를 넘을 수 없음)
ArrayDeque<int[]> bridge = new ArrayDeque<>();
int time = 0;
while (wait.size() != 0 || bridge.size() != 0) {
// 다리에서 내릴 수 있으면 내리기
if(!bridge.isEmpty() && bridge.peek()[1] == 1) {
bridge.pollFirst();
}
// 다리 위의 차 한 칸씩 이동
for (int[] truck : bridge) {
truck[1]--;
}
// 대기열이 비어있지 않고 다리에 빈 자리가 있으며 남은 무게보다 적게 나가는 경우 다리에 올리기
int currentWeight = bridge.stream().mapToInt(arr -> arr[0]).sum();
if(!wait.isEmpty() && bridge.size() < bridge_length && wait.peek() <= weight - currentWeight) {
bridge.addLast(new int[] {wait.pollFirst(), bridge_length});
}
time++;
}
return time;
}
}
💡 풀이
- 대기 목록 큐를 만들어 모든 트럭을 add
- 트럭 무게와 남은 움직임 수를 저장하는 다리 큐 생성
- 대기목록과 다리 위 트럭이 없을 때까지 while문 반복
- 남은 움직임이 1이면 내리기(= 다리에서 내릴 수 있으면 내리기)
- 다리 위의 차 한 칸씩 이동
- 대기열이 비어있지 않고 다리에 빈 자리가 있으며 남은 무게보다 같거나 적게 나가는 경우 다리에 올리기
💭 회고
처음에 올리고 → 이동하고 → 내리고 순서로 코드를 짰더니 결과값이 예상과 달랐다. 근데 또 그 값이 불규칙해서 어디가 문제인지 찾기 어려웠다. 지피티의 도움을 받아서 어디가 문제인지 이해할 수 있었다. 올리는 것과 이동하는 것은 각각 1초를 써야하는데 올린 다음 이동하는 순서로 짰기 때문에 1초 안에 올리는 것과 동시에 이동하게 된 것이다. 크게 코드를 바꾸지 않고 순서만 바꿨는데도 바로 통과했다😅 단위 시간이 지날 때 어떤 일이 일어나는지 잘 생각해보면서 코드를 짜야겠다.
다른 코드를 통해
- 트럭을 객체화한다
- 다리 위 트럭 무게 합을 구할 때 큐를 순회하지 말고 변수 하나에 빼고 더한다
이런 아이디어를 얻을 수 있었다. 특히 1번이 중요하다 느낀게 트럭을 배열로 표현하면서 설명이 없다면 각 인덱스가 무얼 의미하는지 이해하기 어렵겠다는 생각을 했는데 트럭을 객체로 만든다면 가독성도 좋고 관리도 편하기 때문이다. 객체로 만들기.. 연습이 필요할 것 같다.
새롭게 알게 된 것
- 배열을 담은 Collection 객체에서 특정 인덱스의 원소의 합을 구하는 방법
collection.stream().mapToInt(arr -> arr[0]).sum()
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [Java] Lv2. 기능 개발 (1) | 2025.06.07 |
|---|---|
| [Java] Lv1. 카드 뭉치 (0) | 2025.06.07 |
| [Java] Lv2. 올바른 괄호 (1) | 2025.06.01 |
| [Java] Lv2. 짝지어 제거하기 (0) | 2025.06.01 |
| [Java] Lv2. 주식가격 (0) | 2025.06.01 |