티스토리 뷰
문제 원본 링크: https://programmers.co.kr/learn/courses/30/lessons/42583
카테고리: 스택/큐
문제 설명
트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순서로 건너려 한다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 한다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리의 무게는 weight까지 견딘다.
* 트럭이 다리에 완전히 오르지 않으느 경우, 이 트럭의 무게는 고려하지 않는다.
예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있다. 무게가 [7, 4, 5, 6]kg인 트럭들이 순서대로 최단 시간에 다리를 건너려면 다음과 같이 건너야 한다.
따라서 모든 트럭이 다리를 지나려면 최소 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 이하이다.
입출력 예
내 풀이 과정
-
while 문이 한 번 진행될 때 1초가 흐른다고 가정한다.
-
그리고 다리 위의 트럭은 1만큼 앞으로 전진한다.
-
1초마다 아래의 항목들을 수행한다.
-
answer + 1
-
다리위 트럭이 하나도 없으면 종료한다.
-
다리위 트럭들의 무게의 합을 구한다.
-
다리위 트럭의 위치 +1
-
다리의 무게에 여유가 있으면 새로운 트럭이 건너기 시작한다.
-
자바 코드
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
Queue<Integer> waitingTrucks = new LinkedList<>();
Queue<Truck> passingTrucks = new LinkedList<>();
for (int w : truck_weights) waitingTrucks.offer(w);
while (true) {
if (passingTrucks.isEmpty()) {
// 모든 트럭이 건넜으면 반복문 종료
if (waitingTrucks.isEmpty()) break;
else passingTrucks.offer(new Truck(waitingTrucks.poll(), 0));
} else {
int totalWeight = 0;
// 다리 위의 트럭을 1만큼 전진
for (Truck truck : passingTrucks) {
truck.position++;
totalWeight += truck.weight;
}
// 모두 건넌 트럭은 제외
if (passingTrucks.peek().position == bridge_length) {
totalWeight -= passingTrucks.peek().weight;
passingTrucks.poll();
}
// 대기중인 트럭이 아직 있고 다리 위 무게 여유가 있다면 건너기 시작
if (!waitingTrucks.isEmpty() && waitingTrucks.peek() + totalWeight <= weight)
passingTrucks.offer(new Truck(waitingTrucks.poll(), 0));
}
answer++;
}
return answer;
}
private static class Truck {
int weight;
int position;
public Truck(int weight, int position) {
this.weight = weight;
this.position = position;
}
}
Truck 클래스를 만들어 무게와 위치를 저장할 수 있도록 구현했다.
이번에도 코드가 간결하지는 않아서 아쉽다. 쩝.
참고
- 깃허브 소스: 링크
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[알고리즘 문제 풀이] 프로그래머스 - 네트워크 (0) | 2020.12.12 |
---|---|
[알고리즘 문제 풀이] 프로그래머스 - 카펫 (0) | 2020.12.05 |
[알고리즘 문제 풀이] 프로그래머스 - 이중우선순위큐 (0) | 2020.11.24 |
[알고리즘 문제 풀이] 프로그래머스 - 더 맵게 (0) | 2020.11.18 |
[알고리즘 문제 풀이] 프로그래머스 - 기능개발 (0) | 2020.11.11 |
[알고리즘 문제 풀이] 프로그래머스 - 주식 가격 (0) | 2020.11.10 |
[알고리즘 문제 풀이] 프로그래머스 - 베스트앨범 (0) | 2020.11.07 |
[알고리즘 문제 풀이] 프로그래머스 - 위장 (0) | 2020.11.01 |
- Total
- Today
- Yesterday
- 알고리즘
- 비전공개발자
- 건조기
- 알고리즘 풀이
- 이직
- 멘토에게묻다
- 서평
- 세탁기설치
- 디버깅
- 프로그래머의길멘토에게묻다
- 개발자취업
- 프로그래머의 길
- Regex
- 알고리즘풀이
- 안드로이드
- 소프트웨어장인
- 멘토에게 묻다
- 정규표현식
- 이사
- software craftmanship
- 프로그래머스
- 문과생개발자
- 개발자
- 괄호 종류
- 세탁기
- 건조기설치
- 소프트웨어 장인
- 프로그래머의길
- 스타트업
- 정규식
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |