๐ง ํ๋ก๊ทธ๋๋จธ์ค 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๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ๊ตฌํ ์ ํ์ด ์์ธ ์ผ์ด์ค๊ฐ ๋ง์ ๊ฒ ๊ฐ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ์์ ์ฐพ๊ธฐ (์์ ํ์, ์์, ์กฐํฉ) (0) | 2023.10.19 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค LV3] ๋์คํฌ ์ปจํธ๋กค๋ฌ(Heap, ํ) (1) | 2023.10.18 |
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ๊ธฐ๋ฅ๊ฐ๋ฐ (Queue, ํ) (0) | 2023.10.17 |
[๋ฐฑ์ค 1162] ๋๋กํฌ์ฅ (Dijkstra, ๋ค์ต์คํธ๋ผ) (2) | 2023.10.16 |
[๋ฐฑ์ค 1446] ์ง๋ฆ๊ธธ (Dijkstra, ๋ค์ต์คํธ๋ผ) (0) | 2023.10.15 |