삽질메모장

programmers : stack queue 3 (다리를 지나는 트럭)[java] 본문

Knowledge/알고리즘

programmers : stack queue 3 (다리를 지나는 트럭)[java]

shovel 2022. 1. 6. 23:43

1. 히든 테스트 통과못한 첫제출 

최대한 짧게, 빠르게 쓰려고만 하면 이런문제에서 꼭 막힌다.

public int solution(int bridge_length, int weight, int[] truck_weights) {
		int answer = 0;

		Queue<Integer> queue = new LinkedList<>();

		for(int i=0; i < truck_weights.length; i++ ) {
			queue.add(truck_weights[i]);
		}
		while(!queue.isEmpty()) {
			int total_weight =0;
			int time =0;
			total_weight = queue.poll();
			while(!queue.isEmpty()) {
				if(weight >= total_weight + queue.peek()) {
					total_weight += queue.poll();
					time++;
				}else {
					answer += bridge_length + time;
					break;
				}
			}
			if(queue.isEmpty()) {
				answer += bridge_length+time;
				break;
			}
		}
		answer ++;
		return answer;
	}

2. 다른 풀이 참고

truck class 를 선언하여 각 객체가 자신의 무게와 이동시간을 맴버로 선언

대기중인 트럭, 다리위에 올라선 트럭을 두개의 queue로 선언

앞서 먼저 풀려한방법에는 각 트럭이 지나가는것을 직관적으로 풀기보다 총무게를 넘어서면 길이와 올라온 truck의 갯수를 측정하여 임의로 연산을 하려했으나

해당 풀이는 반복문내의 조건에 걸리지않아도 일단 move queue의 truck 은 무조건 move++를 하도록 역할을 위임하는 형태로 구성하였다

때문에 코드가 훨씬더 직관적이다. 

public class stack_queue_3 {
	class truck{
		int weight =0;
		int move = 1; 
		public truck(int weight) {
			this.weight = weight;
		}
		public void moving() {
			move ++; 
		}
	}
	public int solution(int bridge_length, int weight, int[] truck_weights) {
		int answer = 0;
		Queue<truck> wait_queue = new LinkedList<>();
		Queue<truck> move_queue = new LinkedList<>();

		for(int i=0; i < truck_weights.length; i++ ) {
			wait_queue.add(new truck(truck_weights[i]));
		}
		
		int total_weight =0;
		while(!wait_queue.isEmpty() || !move_queue.isEmpty()) {
			answer ++;
			if (move_queue.isEmpty()) { //다리 비엇을 때
				move_queue.add(wait_queue.poll());
				total_weight = move_queue.peek().weight;
				continue;
			}
			for(truck t : move_queue) t.moving();
			
			if(bridge_length  < move_queue.peek().move) { //제일 앞차가 다리를 통과
				truck  t = move_queue.poll();
				total_weight -= t.weight;
				
			}
			if(!wait_queue.isEmpty() && weight >= total_weight + wait_queue.peek().weight) {
				truck t = wait_queue.poll();
				move_queue.add(t);
				total_weight += t.weight;
			}
		}
		return answer;
	}