๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV2] ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ(Queue, ํ)

๋ฐ˜์‘ํ˜•
SMALL

๐Ÿง ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV2. ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ

๋ฌธ์ œ ์„ค๋ช…

ํŠธ๋Ÿญ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๊ฐ•์„ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ์ผ์ฐจ์„  ๋‹ค๋ฆฌ๋ฅผ ์ •ํ•ด์ง„ ์ˆœ์œผ๋กœ ๊ฑด๋„ˆ๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ๋ ค๋ฉด ์ตœ์†Œ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฆฌ์—๋Š” ํŠธ๋Ÿญ์ด ์ตœ๋Œ€ 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 ์ดํ•˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

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

 

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

๋‹ค๋ฆฌ์— ์˜ค๋ฅด์ง€ ์•Š์€ ํŠธ๋Ÿญ Queue, ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๊ฐ€๊ณ  ์žˆ๋Š” ํŠธ๋Ÿญ Queue 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

ํ•„์š”ํ•œ ํด๋ž˜์Šค์™€ ๋ณ€์ˆ˜๋ถ€ํ„ฐ ์ •์˜ํ•ด์ค€๋‹ค.

๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ์€ ๋ฌด๊ฒŒ์™€ ์ง€๋‚˜๊ณ  ์žˆ๋Š” ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์ค€๋‹ค.

Queue<Integer> queue = new LinkedList<>(); // ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ
Queue<Truck> bridgeQueue = new LinkedList<>(); // ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ

for (int truck_weight : truck_weights) { // ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ Queue ์ดˆ๊ธฐํ™”
	queue.add(truck_weight);
}

int sum = 0, time = 0; // ๋‹ค๋ฆฌ ์œ„์˜ ํŠธ๋Ÿญ ๋ฌด๊ฒŒ ํ•ฉ, ๊ฒฝ๊ณผํ•œ ์‹œ๊ฐ„
private class Truck {
	int weight; // ํŠธ๋Ÿญ ๋ฌด๊ฒŒ
	int pos; // ์ง€๋‚˜๊ณ  ์žˆ๋Š” ์œ„์น˜
        
	Truck(int weight, int pos) {
		this.weight = weight;
		this.pos = pos;
	}
}

 

2๊ฐœ์˜ ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ์‹คํ–‰ํ•œ๋‹ค.

while (!queue.isEmpty() || !bridgeQueue.isEmpty()) {
	if (!bridgeQueue.isEmpty()) { // ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ์ด ์žˆ์œผ๋ฉด
		Truck truck = bridgeQueue.peek();
		if (truck.pos == bridge_length) {
			bridgeQueue.poll();
			sum -= truck.weight; // ๋‹ค๋ฆฌ ์œ„ ํŠธ๋Ÿญ ๋ฌด๊ฒŒ ํ•ฉ ์—…๋ฐ์ดํŠธ
   		}
        
		while(!bridgeQueue.isEmpty()) { // ๋‹ค๋ฆฌ ์œ„์— ๋‚จ์•„์žˆ๋Š” ํŠธ๋Ÿญ ์œ„์น˜ ์—…๋ฐ์ดํŠธ
			Truck t = bridgeQueue.poll();
			bridgeQueue.add(new Truck(t.weight, t.pos + 1));
		}
	}
            
	if (!queue.isEmpty()) { // ๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ์ด ์žˆ์œผ๋ฉด
		int next = queue.peek();
		if (bridgeQueue.size() < bridge_length && sum + next <= weight) { // ๋‹ค๋ฆฌ ์ƒํ™ฉ
			bridgeQueue.add(new Truck(next, 1));
			queue.poll();
			sum += next; // ๋‹ค๋ฆฌ ์œ„ ๋ฌด๊ฒŒ ํ•ฉ ์—…๋ฐ์ดํŠธ
		}
	}
            
	time++; // ์‹œ๊ฐ„ ๊ฒฝ๊ณผ
}

๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ์ด ์žˆ์œผ๋ฉด ๋จผ์ € ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

๊ฐ€์žฅ ์ฒ˜์Œ ๋‹ค๋ฆฌ๋ฅผ ์˜ฌ๋ผ์˜จ ํŠธ๋Ÿญ์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฆฌ ๋์— ๋‹ฟ์•˜์œผ๋ฉด ํ์—์„œ ๊บผ๋‚ธ๋‹ค. (๋‹ค๋ฆฌ ์œ„ ํŠธ๋Ÿญ ๋ฌด๊ฒŒ ํ•ฉ ์—…๋ฐ์ดํŠธ ํ•„์š”)

๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ์ด ์žˆ๊ณ , ๋‹ค์Œ ํŠธ๋Ÿญ์ด ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚  ์ˆ˜ ์žˆ์œผ๋ฉด(ํŠธ๋Ÿญ ๊ฐœ์ˆ˜๊ฐ€ ๋‹ค๋ฆฌ ๊ธธ์ด ์ดํ•˜์ด๊ณ , ๋“ค์–ด ์˜จ ํŠธ๋Ÿญ ํฌํ•จ ๋ฌด๊ฒŒ ํ•ฉ์„ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ์Œ) ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•œ๋‹ค.

๋Œ€๊ธฐ ์ค‘์ธ ํŠธ๋Ÿญ์„ ํ์—์„œ ๊บผ๋‚ด๊ณ , ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํ์— ์‚ฝ์ž…ํ•œ๋‹ค. (๋‹ค๋ฆฌ ์œ„ ๋ฌด๊ฒŒ ํ•ฉ ์—…๋ฐ์ดํŠธ ํ•„์š”)

 

์œ„ ํ’€์ด ๋ฐฉ์‹์„ ์ „์ฒด ์ฝ”๋“œ๋กœ ํ’€์–ด๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import java.util.*;

class Solution {
    private class Truck {
        int weight;
        int pos;
        
        Truck(int weight, int pos) {
            this.weight = weight;
            this.pos = pos;
        }
        
        @Override
        public String toString() {
            return "(" + this.weight + " " + this.pos + ")";
        }
    }
    
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> queue = new LinkedList<>();
        for (int truck_weight : truck_weights) {
            queue.add(truck_weight);
        }
        
        Queue<Truck> bridgeQueue = new LinkedList<>();
        int sum = 0, time = 0;
        
        while (!queue.isEmpty() || !bridgeQueue.isEmpty()) {
            if (!bridgeQueue.isEmpty()) {
                Truck truck = bridgeQueue.peek();
                if (truck.pos == bridge_length) {
                    bridgeQueue.poll();
                    sum -= truck.weight;
                }
                int size = bridgeQueue.size();
                while(size-- > 0) {
                    Truck t = bridgeQueue.poll();
                    bridgeQueue.add(new Truck(t.weight, t.pos + 1));
                }
            }
            
            if (!queue.isEmpty()) {
                int next = queue.peek();
                if (bridgeQueue.size() < bridge_length && sum + next <= weight) {
                    bridgeQueue.add(new Truck(next, 1));
                    queue.poll();
                    sum += next;
                }
            }
            
            time++;
        }

        return time;
    }
}

 

โœจ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๋ฉฐ

Queue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๋Š” ๊ตฌํ˜„ ์œ ํ˜•์ด ์„ž์ธ ์ผ€์ด์Šค๊ฐ€ ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•
LIST