알고리즘/프로그래머스
[프로그래머스] 다리를 지나는 트럭_JAVA
jimkwon
2022. 2. 11. 14:29
반응형
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42583
트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다.
첫 구절을 읽자마자 뭐다? 큐다~ "정해진 순"과 같이 선입선출의 냄새를 풍기는 문제는 바로 큐를 파악해야 한다.
다리를 건너는 중인 트럭을 큐에 넣는다. 단, 큐에 삽입 전 다리의 무게를 넘지 않도록 고려한다.
큐에 들어가는 인자들은 [트럭이 다리를 다 건널때의 시간] = [현재 초 + 다리의 길이] 를 집어넣는다.
트럭이 다리를 다 건너면, 큐에서 해당 트럭을 빼고 대기중인 트럭을 넣을지 여부를 결정한다.
트럭이 모두 다리를 다 건너면 끝
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 2;
int totalWeight = truck_weights[0];
int outIndex = 0; // 다리 빠져나오는 트럭
int newIndex = 1; // 다리 들어오는 트럭
Queue<Integer> que = new LinkedList<>();
que.add(bridge_length + 1);
while(outIndex != truck_weights.length) {
if (que.peek() == answer) { // 맨 앞트럭이 다리 다 건넘
que.poll();
totalWeight -= truck_weights[outIndex];
outIndex++;
if (outIndex == truck_weights.length)
break;
} // 다리에 새로운 트럭 출발
if (newIndex != truck_weights.length && totalWeight + truck_weights[newIndex] <= weight) {
que.add(answer + bridge_length);
totalWeight += truck_weights[newIndex];
newIndex++;
}
answer++;
}
return answer;
}
}
해당 풀이는 보시다시피 선언한 변수가 좀 많다.. 통과한 후 다른 사람 풀이를 보니 Class를 선언하여
이러한 불상사를 객체를 통해 보완하는 것을 확인할 수 있었다. 따라서 클래스를 이용한 풀이도 첨부한다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
class truck {
int time;
int weight;
public truck(int time, int weight) {
this.time = time;
this.weight = weight;
}
}
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 2;
int totalWeight = truck_weights[0];
Queue<truck> wait = new LinkedList<>();
Queue<truck> running = new LinkedList<>();
for(int truck : truck_weights)
wait.add(new truck(bridge_length, truck));
wait.poll();
running.add(new truck(bridge_length + 1, truck_weights[0]));
while(!(running.isEmpty() && wait.isEmpty())) {
if (running.peek().time == answer) {
totalWeight -= running.peek().weight;
running.poll();
}
if (!wait.isEmpty() && totalWeight + wait.peek().weight <= weight) {
running.add(new truck(answer + wait.peek().time, wait.peek().weight));
totalWeight += wait.poll().weight;
}
if (running.isEmpty() && wait.isEmpty())
break;
answer++;
}
return answer;
}
}
다만, 실제로 코테를 보느 중에 클래스를 짜서 할 일이 있을까?.. 라는 생각
클래스를 짜지 않고도 풀 수 있는 문제들은 아마 첫 번째 풀이처럼 하지 않을까 싶다