🌱 큐(Queue) 란 ?
먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로 저장하는 형식의 자료구조
분명 전에 한 번 구현해보고 문제도 많이 풀었었는데,
어떻게 잠깐 알고리즘 공부 쉬었다고 이렇게 초멘나사이가 됐지...? 😭
다시 매일 꾸준히 하자!! 🔥
경과 | 시간 | 다리를 지난 트럭 | 다리를 건너는 트럭 대기 트럭 |
---|---|---|---|
0 | [] | [] | [7,4,5,6] |
1~2 | [] | [7] | [4,5,6] |
3 | [7] | [4] | [5,6] |
4 | [7] | [4,5] | [6] |
5 | [7,4] | [5] | [6] |
6~7 | [7,4,5] | [6] | [] |
8 | [7,4,5,6] | [] | [] |
표를 보고 알 수 있는 내용
풀이1. Queue로 간단히 풀기
다리 위에 차량도 없고, + 대기 중인 트럭이 없을 때까지 반복한다
입차 조건 : 대기 중인 트럭이 있고 + 다리 위 트럭무게 총합 + 입차하려는 차량의 무게 <= 다리가 버틸 수 있는 무게일 때
.shift()
해서,bridge[]
배열에 넣고 (위치 0)출차 조건 : 다리 위에 차량이 있고 + 다리 위에 있는 차량 중 가장 첫 번째 차량의 위치가 다리의 길이와 같을 때
.shift()
,function solution(bridge_length, weight, truck_weights) {
let time = 0, bridge = [], totalWeights = 0
while(bridge.length > 0 || truck_weights.length > 0){
time++
// 다리 위의 모든 차량 위치 +1 이동 // [위치, 무게] = bridge[i]
for(let i = 0; i < bridge.length; i++){
bridge[i][0]++
}
// 출차
if(bridge[0] && bridge[0][0] >= bridge_length){
let [_, truckWeight] = bridge.shift()
totalWeights -= truckWeight
}
// 입차
if(truck_weights.length && weight >= totalWeights + truck_weights[0] ){
let truck = truck_weights.shift()
bridge.push([0, truck])
totalWeights += truck
}
}
return time
}
풀이2. class로 신기한(?) 풀이
1차 도전 : splice로 풀기
입력이 7 3 일 때 출력이 <3, 6, 2, 7, 5, 1, 4> 로 나와야 하는데 <3, 2, 1, 7, 5, 4, 6> 로 나왔다.
1 부터 N 까지 담긴 배열에서 K 번째 숫자를 꺼낸 후,
꺼내진 숫자로부터 다시 다음 K 번째 숫자를 꺼내야 하는데,
이 때 K번째가 배열의 길이를 넘어갈 때,
어떻게 다시 0번째 인덱스로 넘어갈 지 알고리즘을 짜는게 어려웠다.
계속 출력되는 순서가 안맞아서 splice 풀이법을 포기하고 다른 방법을 찾아봤는데,
풀고나서 다른 사람들의 숏코딩을 보니 splice로 푼 풀이도 있어서 다시 도전해보기로 했다.
let [N, K] = require('fs').readFileSync(0).toString().trim().split(' ').map(Number)
let a = [...Array(N)].map((_, idx) => idx + 1)
let answer = []
while (a.length) {
let i = --K
answer.push(a.splice(i, 1)[0])
i = (i + K) % --N
}
console.log(`<${answer.join(', ')}>`) // <3, 2, 1, 7, 5, 4, 6>
2번차 도전
class 로 원형 likned list를 만들어서 .next() 로 풀어야할 지 고민했는데,
class를 새로 만들어서 풀기에는 풀이가 너무 복잡해질 거 같아서 pass
원형 linked list 구현은 한 번 해봐야겠다고 생각 🔥
3번 째 풀이 : Queue 에 담아서 K 번째 숫자가 맞으면 answer에 담고,
아니면 Queue의 맨 뒤로 보내서 숫자가 모두 제거될 때까지 마지막 숫자에서 첫 번째 숫자로 계속 숫자들이 이어지도록 하기
N이 7이면 [1, 2, 3, 4, 5, 6, 7]
% K === 0
이므로 if(count % K ===0)
으로 조건 작성K가 3이면 [3, 4, 5, 6, 7, 1, 2]
let [N, K] = require('fs').readFileSync(0).toString().trim().split(' ').map(Number)
let que = [...Array(N)].map((_, idx) => idx + 1)
let answer = [],
count = 1
while (que.length > 0) {
const shiftItem = que.shift()
if (count % K === 0) {
answer.push(shiftItem)
} else {
que.push(shiftItem)
}
count++
}
console.log(`<${answer.join(', ')}>`)
const [N, K] = require('fs').readFileSync(0).toString().trim().split(' ').map(Number)
let arr = [...Array(N)].map((_, idx) => idx + 1)
let pick = 0
let answer = []
while (arr.length) {
pick = (pick + K - 1) % arr.length
answer.push(arr.splice(pick, 1))
}
console.log('<' + answer.join(', ') + '>')