bass
article thumbnail

JS에서의 큐?

자바스크립트의 리스트는 큐의 디큐(dequeue) 역할을 하는 shift() 함수가 존재하기는 합니다만, 시간 복잡도가 O(n)입니다. 사실상 시간적으로는 디큐의 역할을 하지 못하는 것입니다.

index를 활용해서 큐의 시작점을 바꿀 수 있지만, 이 또한 공간적으로 디큐의 역할을 하지 못합니다.

그렇다고 연결리스트로 큐를 구현하기에는 너무 코드가 길어지고 코딩 테스트에서 활용하기 어렵습니다.

index와 delete 연산으로 해결하기

delete연산은 시간복잡도가 O(1)입니다. 다만 리스트의 길이가 줄어들지 않습니다.

 

const list = [0, 1, 2];
delete list[0];
list
// [ <1 empty item>, 2, 3 ]
list[0]
// undefined

 

그래서 head 역할을 하는 index와 함께 활용하면 큐처럼 디큐 동작을 할 수 있습니다.

 

아래는 큐를 사용하는 BFS 구현의 예제입니다.

shift 를 사용하는 예제

const q = [start];
while (q.length !== 0) {
  const node = q.shift();
  ...
}

delete 를 사용하는 예제

let head = 0;
const q = [start];
while (q[head] !== undefined) {
  const node = q[head];
  delete q[head];
  head += 1;
  ...
}

주의할 점

MDN Web Docs에 따르면 delete 사용 시 바로 메모리를 비우지는 않습니다.

하지만 메모리 초과가 나오던 코드가 delete 사용 시 통과하는 것으로 보아 사용하는 의미가 있다고 생각합니다.

'JS' 카테고리의 다른 글

JS 정리  (0) 2023.08.23
profile

bass

@bassyu

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!