인프런 커뮤니티 질문&답변

rhkdtjd_12님의 프로필 이미지
rhkdtjd_12

작성한 질문수

비전공자의 전공자 따라잡기 - 자료구조(with JavaScript)

스택, 큐 구현하기

숙제2 연결리스트를 이용하여 큐 구현하기

작성

·

133

·

수정됨

0

학습 목표

- 배열 치트키 자료구조가 아닌 연결 리스트를 이용하여 queue 자료구조를 구현하자.

- 삽입과 삭제를 시간복잡도 O(1)가 되게 해야됨.

- queue은 FIFO이기 때문에 삭제시 첫번째를 삭제해야됨.

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
    this.prev = null;
  }
}

class LinkedList {
  constructor(length = 0) {
    this.length = length;
    this.head = null;
    this.tail = null;
  }

  add(value) {
    const newNode = new Node(value);
    if (this.head === null) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      newNode.prev = this.tail;
      this.tail.next = newNode;
      this.tail = newNode;
    }

    this.length++;
    return this.length;
  }

  // 스택 구현시 삭제 메서드
  removeLast() {
    const value = this.tail.value;
    this.tail.prev.next = null; // 제일 마지막 이전의 next의 좌표를 null로 변경해줌
    this.tail = this.tail.prev; // 마지막을 tail의 이전 노드로 변경 해줌

    return value;
  }

  // 큐 구현시 삭제 메서드
  removeFirst() {
    const value = this.head.value;
    this.head.next.prev = null; // 제일 첫번째 다음의 이전 좌표를 null로 변경해줌
    this.head = this.head.next; // 첫번째를 head next 노드로 변경 해줌

    return value;
  }
}

// 숙제2 연결리스트로 큐 만들기
class Queue {
  linkedList = new LinkedList();

  add(value) {
    return this.linkedList.add(value);
  }

  shift() {
    return this.linkedList.removeFirst();
  }

  get top() {
    return this.linkedList.head.value;
  }

  get length() {
    return this.linkedList.length;
  }
}

const queue = new Queue();
console.log(queue.add(1)); // 1
console.log(queue.add(3)); // 2
console.log(queue.add(5)); // 3

console.log(queue.top); // 1
console.log(queue.length); // 3
console.log(queue.shift()); // 1

 

결과

head의 value값이 3, prev가 null이 되고 next가 value가 5인 노드를 가르킴

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

rhkdtjd_12님의 질문을 보니, 연결리스트를 이용하여 큐(Queue) 자료구조 구현과 관련하여 도움이 필요하신 것 같습니다. 연결리스트를 활용해 큐 구조를 구현하는 것은 데이터 구조와 알고리즘 학습에 있어 중요한 단계입니다. 특히, 삽입과 삭제 연산을 O(1)의 시간 복잡도로 처리하고자 하는 목표는 큐의 효율적인 구현을 위해 핵심적입니다.

rhkdtjd_12님이 공유하신 코드는 이미 이중 연결 리스트(Double LinkedList)를 기반으로 한 큐의 구현을 잘 시도하셨습니다. add, removeFirst, top, length 메소드를 포함하여 큐의 기본적인 동작을 잘 표현하셨네요. 연결 리스트를 사용하여 add 연산을 마지막 노드에 추가하고, shift (또는 removeFirst라고 구현하신)을 사용하여 첫 번째 노드를 삭제하는 방식은 FIFO(First-In-First-Out) 원칙에 따른 큐의 동작 방식을 잘 반영하고 있습니다.

이와 비슷한 주제로 다룬 예를 여기에서 제공된 링크를 통해 참고하실 수 있습니다:
- 연결 리스트 구현 숙제 리뷰 부탁드려봅니다 - 연결 리스트 구현과 관련한 질의응답으로, 연결리스트의 기본적인 구조 및 메소드 구현법에 대한 토론이 포함되어 있습니다. 이는 연결리스트 기반의 자료구조 구현에 관한 깊은 이해를 돕습니다.

물론 직접적으로 큐 구현에 대한 답변은 아니지만, 연결 리스트의 추가, 삭제 및 탐색 메소드 구현에 대해 이해도를 높이는 데 도움을 줄 수 있으리라 생각됩니다. rhkdtjd_12님의 코드에 포함된 연결 리스트를 이용한 큐 구현 방식이 매우 효율적으로 보입니다. 단, removeFirst 메소드에서 null 체크를 포함하지 않은 점은 주의가 필요할 수 있습니다. 연결 리스트가 비어있을 때 removeFirst 메소드를 호출하면 에러가 발생할 수 있으니, 이 부분을 보완하는 것이 좋겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

rhkdtjd_12님의 프로필 이미지
rhkdtjd_12

작성한 질문수

질문하기