[ Data Structure ] 🍑 큐(Queue)

2025. 1. 2. 20:04Β·πŸ§ͺ Computer science/Data Structure

πŸ“š 큐(Queue)의 κ°œλ…

큐(Queue) λŠ” '쀄을 μ„œλ‹€' λΌλŠ” λœ»μ„ κ°€μ§€κ³  μžˆλ‹€.
νλŠ” λ¨Όμ € λ“€μ–΄κ°„ 데이터가 λ¨Όμ € λ‚˜μ˜€λŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.
νμ—­μ‹œ μŠ€νƒκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μƒν™œ μ†μ—μ„œ μ‰½κ²Œ 예λ₯Ό μ°Ύμ•„λ³Ό 수 μžˆλŠ”λ°

식당에 쀄을 μ„  μˆœμ„œλŒ€λ‘œ 식당에 μž…μž₯μž₯ν•  λ•Œλ₯Ό 생각해보면 λœλ‹€.

이런 큐(Queue) 의 νŠΉμ§•μ„ μ„ μž…μ„ μΆœ λ˜λŠ” FIFO(first in first out)이라고 ν•œλ‹€.

그리고 μŠ€νƒκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ 큐도 μ‚½μž…ν•˜λŠ” 연산을 push, κΊΌλ‚΄λŠ” 연산을 pop이라고 ν•œλ‹€.

 

βš™οΈ 큐(Queue)의 λ™μž‘ 원리

그럼 큐(Queue) μ—μ„œ μ›μ†Œκ°€ μ΄λ™ν•˜λŠ” 과정을 λ‹€μŒκ³Ό 같이 그림으둜 κ·Έλ €μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€.

 

1. μš°μ„  빈 큐(Queue) λ₯Ό ν•˜λ‚˜ μ„ μ–Έν•΄μ£Όκ² λ‹€.

 

 

2. ν•΄λ‹Ή 큐에 μ›μ†Œ 2 λ₯Ό μ‚½μž…ν•˜λŠ”λ° 빈 νμ΄λ―€λ‘œ 제일 μ•žμ— μ‚½μž…μ„ ν•œλ‹€.( push에 ν•΄λ‹Ήν•œλ‹€. )

 


μ΄μ–΄μ„œ 5 λ₯Ό μ‚½μž…ν•˜λŠ”λ° ( push에 ν•΄λ‹Ήν•œλ‹€. )
5 λŠ” 2 λ‹€μŒμœΌλ‘œ μ‚½μž…ν–ˆμœΌλ‹ˆκΉŒ 5 λŠ” 2 보닀 뒀에 μžˆκ²Œλœλ‹€.

 

 

3. 이제 2 번과 같은 μƒνƒœ νμ—μ„œ pop을 ν•˜κ²Œλ˜λ©΄
λ‹€μŒκ³Ό 같이 λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ 5 κ°€ μ•„λ‹ˆλΌ λ¨Όμ € λ“€μ–΄μ˜¨ 2 κ°€ λ¨Όμ € λ‚˜μ˜€κ²Œ λœλ‹€.

 


그리고 λ‚˜μ„œ μ΄μ–΄μ„œ pop을 ν•œ 번 더 μ§„ν–‰ν•˜λ©΄ 5 κ°€ λΉ μ Έλ‚˜μ˜€κ²Œ λœλ‹€.

 


그럼 이제 λͺ¨λ“  μ›μ†Œκ°€ 큐(Queue) μ—μ„œ λΉ μ Έλ‚˜μ˜€κ²Œλœ μƒνƒœμ΄λ―€λ‘œ λ‹€μŒκ³Ό 같이 ν…… λΉ„μ–΄μžˆλ‹€.

 

μŠ€νƒ(Stack) 은 λ¨Όμ € λ“€μ–΄μ˜¨κ²Œ λ‚˜μ€‘μ— λΉ μ Έλ‚˜μ˜€μ§€λ§Œ
큐(Queue) 의 경우 λ¨Όμ € λ“€μ–΄μ˜¨κ²Œ λ¨Όμ € λΉ μ Έλ‚˜μ˜€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
 

 

βš–οΈ 큐(Queue)의 μ •μ˜, ADT

큐(Queue) 의 ADT λ₯Ό μ •μ˜ν•΄λ³΄κ³  큐가 μ‹€μ œλ‘œ λ™μž‘ν•˜λŠ” 원리λ₯Ό μ‚΄νŽ΄λ³΄μž

- 큐(Queue)의 ADT

ꡬ뢄 μ •μ˜ μ„€λͺ…
μ—°μ‚° isFull 큐에 λ“€μ–΄ μžˆλŠ” 데이터 κ°œμˆ˜κ°€ maxsize인지 확인 ν›„ boolean κ°’μœΌλ‘œ λ°˜ν™˜
" isEmpty 큐에 λ“€μ–΄ μžˆλŠ” 데이터가 ν•˜λ‚˜λΌλ„ μžˆλŠ”μ§€ μ—†λŠ”μ§€ 확인후 boolean κ°’μœΌλ‘œ λ°˜ν™˜
" push 큐에 데이터λ₯Ό push ν•œλ‹€.
" pop νμ—μ„œ μ²˜μŒμ— pushν•œ 데이터λ₯Ό popν•˜κ³ , ν•΄λ‹Ή 데이터λ₯Ό λ°˜ν™˜ν•œλ‹€.
μƒνƒœ front νμ—μ„œ κ°€μž₯ 처음 popν•œ μœ„μΉ˜λ₯Ό κΈ°λ‘ν•œλ‹€.
" rear νμ—μ„œ μ΅œκ·Όμ— pushν•œ λ°μ΄ν„°μ˜ μœ„μΉ˜λ₯Ό κΈ°λ‘ν•œλ‹€.

 

✨ 큐(Queue)의 λ™μž‘ κ΅¬ν˜„ν•˜κΈ°

그럼 μœ„μ™€ 같이 μ •μ˜ν•œ λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ
λ‹€μŒκ³Ό 같이 큐(Queue)의 λ™μž‘μ„ κ΅¬ν˜„ν•΄ 보자

class Queue {
  _queue = [];
  _maxSize = 10;
  constructor(maxSize) {
    this._maxSize = maxSize;
  }

  isFull(){
    return this._queue === this._maxSize;
  }

  isEmpty(){
    return this._queue.length === 0;
  }

  push(item){
    this._queue.unshift(item);    
  }

  pop(){
    return this._queue.pop();
  }

  front(){
    return this._queue.at(-1);
  }

  rear(){
    return this._queue.at(0);
  }
}

const queue = new Queue();

console.log(queue._queue); // []
console.log(queue.isEmpty()); // true

queue.push(1); // -> [1] 
queue.push(2); // -> [2, 1]
queue.push(3); // -> [3, 2, 1]

console.log(queue._queue); // rear -> [3, 2, 1] -> front

console.log(queue.rear()); // rear: 3
console.log(queue.front()); // front: 1

queue.pop(); // [3, 2] -> 
queue.pop(); // [3] -> 

console.log(queue._queue); // rear -> [3] -> front

 

πŸ€” 큐(Queue)λŠ” μ–Έμ œ μ“ΈκΉŒ?

이처럼 λ¨Όμ € λ“€μ–΄μ˜¨ 것을 λ¨Όμ € μ²˜λ¦¬ν•˜λŠ” 큐(Queue) 의 λ™μž‘ 방식은
ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ 많이 ν™œμš©λ˜κ³  μžˆλ‹€.

λŒ€ν‘œμ μœΌλ‘œ μ—¬λŸ¬ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ λ°œμƒν•œ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•  λ•Œ 큐(Queue) κ°€ ν™œμš©λœλ‹€.

  • μž‘μ—… λŒ€κΈ°μ—΄ : λ„€νŠΈμ›Œν¬ 톡신을 ν•  λ•Œ λ‹€μˆ˜μ˜ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„μ— μš”μ²­ν•˜λ©΄
    μ„œλ²„λŠ” μš”μ²­μ΄ λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ μž‘μ—…μ„ μ²˜λ¦¬ν•˜λŠ”λ° μ΄λ•Œ 큐(Queue)λ₯Ό ν™œμš©ν•  수 μžˆλ‹€.
  • 이벀트 처리 : μ–΄λ–€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ μ‹œμŠ€ν…œμ—μ„œ μ‚¬μš©μžμ˜ 이벀트, 예λ₯Ό λ“€μ–΄ ν‚€λ³΄λ“œ μž…λ ₯μ΄λ‚˜
    마우슀 μ›€μ§μž„μ„ μ²˜λ¦¬ν•  λ•Œ 큐(Queue) λ₯Ό ν™œμš©ν•  수 μžˆλ‹€.

 

πŸ“ 문제 풀이

그럼 μ§€κΈˆκΉŒμ§€ ν•™μŠ΅ν•œ 큐(Queue) 의 κ°œλ…μ„ ν™œμš©ν•΄μ„œ ν•΄λ‹Ή λ¬Έμ œλ“€μ„ 풀어보고
풀이과정을 각 μ½”λ“œ λ§ˆλ‹€ μ£Όμ„μœΌλ‘œ μž‘μ„±ν•˜κ² λ‹€.

πŸ’― : ν’€μ–΄μ„œ 정닡인 문제
πŸ‘€ : μ°Έκ³ ν•΄μ„œ 풀은 문제
πŸ§ͺ : 정닡을 보고 λΆ„μ„ν•œ 문제

 

πŸ’― [ 문제 15 ]. μš”μ„Έν‘ΈμŠ€ 문제

문제 : μ½”λ”© ν…ŒμŠ€νŠΈ ν•©κ²©μž 되기 - μžλ°”μŠ€ν¬λ¦½νŠΈ 편

function solution(n, k){
  const queue = []; // 계산을 μ²˜λ¦¬ν•  Queue
  const answerQueue = []; // 좜λ ₯ν•  값을 λ‹΄μ•„λ†“λŠ” Queue

  // 1λΆ€ν„° nλͺ… κΉŒμ§€μ˜ μ‚¬λžŒλ“€μ„ queue에 μˆœμ„œλŒ€λ‘œ μ±„μš΄λ‹€.
  for(let i=1; i<=n; i++) queue.unshift(i); // rear -> [ 5, 4, 3, 2, 1 ] -> front

  // queue에 μš”μ†Œκ°€ μ‘΄μž¬ν•  λ•Œ
  while(queue.length){    

    // queue의 frontμ—μ„œ 제거, rear에 μΆ”κ°€ λ™μž‘μ„ k번 만큼 반볡
    for(let i=0; i<k; i++){ 
      const item = queue.pop(); // queue의 front에 pop!
      queue.unshift(item); // queue의 reart에 push!
    }            

    const item = queue.pop(); // pop!       
    answerQueue.push(item); // 좜λ ₯ν•  값을 λ‹΄μ•„λ†“λŠ” answerQueue μ‚½μž…ν•œλ‹€.        
  }      

  return answerQueue.at(0); // answerQueue의 rear에 λ“€μ–΄μžˆλŠ” μš”μ†Œλ₯Ό λ°˜ν™˜
}

console.log(solution(5, 3)); // 3
console.log(solution(5, 2)); // 4

 

πŸ‘€ [ 문제 16 ]. κΈ°λŠ₯개발

문제 : ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - κΈ°λŠ₯개발

  • ⏰ μ‹œκ°„μ΄ˆκ³Ό
function solution(progresses, speeds) {
  const date = []; // 각 κΈ°λŠ₯이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ κ±Έλ¦¬λŠ” 일수λ₯Ό μ €μž₯
  let count = 0; // μž‘μ—…μ΄ μ§„ν–‰λœ λ‚ μ§œλ₯Ό μΉ΄μš΄νŒ…

  // progresses 배열에 μš”μ†Œκ°€ μžˆμ„ λ™μ•ˆ
  while (progresses.length) {

    // progresses의 첫 번째 μž‘μ—…μ΄ 100 이상 μ™„λ£Œλœ 경우
    if (progresses[0] >= 100) {
      progresses.shift(); // 첫 번째 μž‘μ—…μ„ λ°°μ—΄μ—μ„œ 제거
      speeds.shift();  // 그에 ν•΄λ‹Ήν•˜λŠ” 첫 번째 속도도 제거

      // μž‘μ—… μ™„λ£ŒκΉŒμ§€ κ±Έλ¦° λ‚ μ§œ countλ₯Ό date 배열에 μΆ”κ°€
      date.push(count);

      // countλ₯Ό μ΄ˆκΈ°ν™”ν•˜μ—¬ λ‹€μŒ μž‘μ—…μ˜ λ‚ μ§œλ₯Ό λ‹€μ‹œ 계산
      count = 0;
      
    } else { // μž‘μ—…μ΄ 100이상 μ™„λ£Œ μ•ˆλ  경우
      
      // progresses[0]에 ν•΄λ‹Ήν•˜λŠ” μž‘μ—…μ„ speeds[0]만큼 더 μ§„ν–‰
      progresses[0] += speeds[0];

      // ν•˜λ£¨κ°€ μ§€λ‚¬μœΌλ―€λ‘œ count 증가
      count++;
    }
  }

  const answer = []; 
  let c = 1; // 같은 λ‚  배포될 κΈ°λŠ₯의 개수λ₯Ό μΉ΄μš΄νŒ…ν•˜λŠ” λ³€μˆ˜
  let stack = []; // μ™„λ£Œλœ μž‘μ—… λ‚ μ§œλ₯Ό 좔적할 μŠ€νƒ

  stack.push(date.shift()); // 첫 번째 μž‘μ—…μ˜ μ™„λ£Œ λ‚ μ§œλ₯Ό μŠ€νƒμ— μΆ”κ°€
  
  // date 배열에 μš”μ†Œκ°€ μžˆλŠ” λ™μ•ˆ
  while (date.length) {
    const top = stack.at(-1);  // μŠ€νƒμ˜ top 값을 κ°€μ Έμ˜΄ (λ§ˆμ§€λ§‰μœΌλ‘œ 배포된 μž‘μ—…μ˜ μ™„λ£Œ λ‚ μ§œ)
    // top이 λ‹€μŒ μž‘μ—…μ˜ μ™„λ£Œ λ‚ μ§œλ³΄λ‹€ ν¬κ±°λ‚˜ κ°™μœΌλ©΄(같은 λ‚  배포 κ°€λŠ₯)
    if (top >= date.at(0)) {
      c++; // 배포될 κΈ°λŠ₯의 개수λ₯Ό 증가
      date.shift(); // μ™„λ£Œλœ μž‘μ—…μ„ dateμ—μ„œ 제거
      
    } else { // λ‹€μŒ μž‘μ—…μ΄ 더 늦게 μ™„λ£Œλ˜λŠ” 경우
      
      answer.push(c); // 배포될 κΈ°λŠ₯의 개수λ₯Ό κ²°κ³Ό 배열에 μΆ”κ°€
      c = 1; // 카운트 μ΄ˆκΈ°ν™”          

      // ν˜„μž¬ μž‘μ—…μ˜ μ™„λ£Œ λ‚ μ§œλ₯Ό μŠ€νƒμ— μΆ”κ°€ν•˜μ—¬ μƒˆλ‘œμš΄ κΈ°μ€€ top으둜 μ„€μ •
      stack.push(date.shift());
    }
  }

  // λ§ˆμ§€λ§‰ 남은 배포될 κΈ°λŠ₯의 개수λ₯Ό κ²°κ³Ό 배열에 μΆ”κ°€
  answer.push(c);

  return answer;
}

console.log(solution([93, 30, 55], [1, 30, 5])); // [2, 1]
console.log(solution([95, 90, 99, 99, 80, 99], [1, 1, 1, 1, 1, 1])); // [1, 3, 2]

 

μ›ν•˜λŠ” κ²°κ³Όκ°’을 μ–»μ—ˆμœΌλ‚˜ μ‹œκ°„μ΄ˆκ³Όκ°€ κ±Έλ €λΆ€λŸΏλ‹€..


λ‹€λ₯Έ μ½”λ“œμ™€ λΉ„κ΅ν•΄μ„œ λ‹€μŒκ³Ό 같이 μ‹œκ°„μ΄ˆκ³Όλ₯Ό ν•΄κ²°ν–ˆλ‹€.

- μ‹œκ°„μ΄ˆκ³Ό ν•΄κ²°

function solution(progresses, speeds) {
  const date = [];  // 각 κΈ°λŠ₯이 μ™„λ£Œλ˜κΈ°κΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ €μž₯

  // progresses 배열을 μˆœνšŒν•΄ 각 μž‘μ—…μ΄ μ™„λ£Œλ˜κΈ°κΉŒμ§€ ν•„μš”ν•œ μ‹œκ°„μ„ 계산
  for (let i = 0; i < progresses.length; i++) {
    // 100%κ°€ 될 λ•ŒκΉŒμ§€ 남은 μž‘μ—…λŸ‰μ„ μ†λ„λ‘œ λ‚˜λˆ„μ–΄ μ™„λ£ŒκΉŒμ§€ ν•„μš”ν•œ λ‚ μ§œ 계산
    // Math.ceil을 μ‚¬μš©ν•΄ μ˜¬λ¦Όν•˜μ—¬ μ†Œμˆ˜μ  μ΄ν•˜ λ‚ μ§œλ₯Ό 처리
    let time = Math.ceil((100 - progresses[i]) / speeds[i]);

    // κ³„μ‚°λœ μ™„λ£Œ 각 μ‹œκ°„λ“€μ„ date 배열에 μΆ”κ°€
    date.push(time);
  }

  const answer = [];
  let count = 1;  // κΈ°λŠ₯의 개수
  let current = date[0]; // 첫 번째 κΈ°λŠ₯이 기쀀이 λ˜λŠ” μ™„λ£Œ λ‚ μ§œ

  // date 배열을 μˆœνšŒν•˜λ©΄μ„œ 배포 κ°€λŠ₯ν•œ μž‘μ—… 그룹을 계산
  for (let i = 1; i < progresses.length; i++) {

    // ν˜„μž¬ κΈ°μ€€ λ‚ μ§œλ³΄λ‹€ 늦게 μ™„λ£Œλ˜λŠ” μž‘μ—…λ“€μ΄ μžˆλŠ”μ§€ 확인
    if (current >= date[i]) { 

      // κΈ°μ€€ λ‚ μ§œλ³΄λ‹€ λŠ¦μ§€ μ•Šμ€ μž‘μ—…λ“€μ€ 같은 배포 그룹에 포함
      count++;

    } else {
      // κΈ°μ€€ λ‚ μ§œλ³΄λ‹€ 늦게 μ™„λ£Œλ˜λŠ” μž‘μ—…μ΄ μžˆλ‹€λ©΄ μ™„λ£Œ
      answer.push(count); // ν˜„μž¬ 그룹의 μž‘μ—… 개수λ₯Ό answer 배열에 μΆ”κ°€
      count = 1;  // 카운트λ₯Ό 1둜 μ΄ˆκΈ°ν™”
      current = date[i];  // μƒˆλ‘œμš΄ κΈ°μ€€ λ‚ μ§œλ‘œ λ³€κ²½
    }
  }

  // λ§ˆμ§€λ§‰μœΌλ‘œ 남은 μž‘μ—…μΌμ„ answer에 μΆ”κ°€
  answer.push(count);

  return answer; 
}

console.log(solution([93, 30, 55], [1, 30, 5])); // [2, 1]
console.log(solution([95, 90, 99, 99, 80, 99], [1, 1, 1, 1, 1, 1])); // [1, 3, 2]

while 문으둜 ν•΄λ‹Ή μš”μ†Œκ°€ μ‘΄μž¬ν•  λ•Œ κΉŒμ§€ 루프λ₯Ό λ„λŠ” λ°©μ‹μœΌλ‘œ ν•˜μ§€μ•Šκ³ 
shift() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ λ°©ν–₯으둜 μ½”λ“œλ₯Ό μž‘μ„±ν•΄ μ‹œκ°„μ΄ˆκ³Όλ₯Ό ν•΄κ²°ν–ˆλ‹€.

 

πŸ’― [ 문제 17 ]. μΉ΄λ“œλ­‰μΉ˜

문제 : ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - μΉ΄λ“œλ­‰μΉ˜

function solution(cards1, cards2, goal) {    

    // 쀑첩 반볡으둜 goal만큼 μˆœνšŒν•΄ cards1, cards2 μš”μ†Œμ™€ 각각 λΉ„κ΅ν•œλ‹€.
      for(let i=0; i<goal.length; i++){
        for(let j=0; j<goal.length; j++){          
              // i에 μˆœνšŒν•˜λŠ” goalμš”μ†Œμ™€ j둜 μˆœνšŒν•˜λŠ” cards1κ°€ 같을 λ•Œ ν•΄λ‹Ή cards1 μš”μ†Œλ₯Ό 제거 
              // μΌμΉ˜ν•˜μ§€ μ•Šμ„ 경우 cards2둜 μœ„μ— μž‘μ—…μ„ 처리
            if(cards1[j] === goal[i]) cards1.shift();                           
            else if (cards2[j] === goal[i]) cards2.shift();                     
        }
    };    

    // cards1, cards2λ₯Ό ν•˜λ‚˜μ˜ λ°°μ—΄λ‘œ κ²°ν•©
    const result = [...cards1, ...cards2];    

      /**
     * - κ²°ν•©λœ λ°°μ—΄ result에 μš”μ†Œκ°€ μžˆμ„ 경우 goalμš”μ†Œμ€‘μ—μ„œ result에 ν¬ν•¨λ˜μ–΄ μžˆλŠ”κ²Œ ν•˜λ‚˜λΌλ„ 있으면       
     *  'Yes' κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 'No'λ₯Ό λ°˜ν™˜
     * - μ˜ˆμ™ΈμΌ 경우 'Yes'λ°˜ν™˜
     */
    if(result.length)!goal.some(str => result.includes(str)) ? 'Yes' : 'No'
      else return 'Yes';      
}

console.log(solution(
  ["i", "drink", "water"],
  ["want", "to"],
  ["i", "want", "to", "drink", "water"]
)); // "Yes"

console.log(solution(
  ["i", "water", "drink"],
  ["want", "to"],
  ["i", "want", "to", "drink", "water"]
)); // "No"

 

회고
μŠ€νƒ(Stack) μ΄λž‘ λΉ„μŠ·ν•œ λŠλ‚Œμ΄λΌ κ°œλ…μ€ 이해 됐닀.
그런데 막상 λ‚œμ΄λ„κ°€ μžˆλŠ” 문제λ₯Ό ν’€λ•ŒλŠ” μ μš©ν•˜κΈ° νž˜λ“€λ‹€.. πŸ₯²

 

좜처

  • μ½”λ”© ν…ŒμŠ€νŠΈ ν•©κ²©μž 되기 - μžλ°”μŠ€ν¬λ¦½νŠΈ 편
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

'πŸ§ͺ Computer science > Data Structure' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[ Data Structure ] πŸ”— μ—°κ²° 리슀트(Linked List)  (0) 2025.01.02
[ Data Structure ] πŸ₯ž μŠ€νƒ(Stack)  (0) 2025.01.02
'πŸ§ͺ Computer science/Data Structure' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [ Data Structure ] πŸ”— μ—°κ²° 리슀트(Linked List)
  • [ Data Structure ] πŸ₯ž μŠ€νƒ(Stack)
Hyungjin
Hyungjin
dadada β˜•οΈ
  • Hyungjin
    πŸ“ hjux.log
    Hyungjin
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기
      • πŸ§‘πŸ»‍πŸ’» Dev
        • UI Components
        • Server
        • Practice
      • πŸ”  Language
        • JavaScript
        • TypeScript
        • Java
      • πŸ“š Library
        • ThreeJs (R3F)
        • GSAP
        • ReactJs
        • React Native
        • NextJs
        • VueJs
      • 🌐 Web
        • Web Animation
        • Web Performance
      • πŸ§ͺ Computer science
        • Algorithm
        • Data Structure
      • 🎨 Design
        • Design System
        • Figma
        • Blender
      • πŸ‘Ύ Git
      • 🚨 Error
      • β˜€οΈ Daily Life
  • λΈ”λ‘œκ·Έ 메뉴

    • πŸˆβ€β¬› Github
  • 인기 κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
Hyungjin
[ Data Structure ] 🍑 큐(Queue)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”