inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[워밍업클럽4기-CS] 미션1 - 자료구조와 알고리즘

아이디안해
1

문제

Python, JavaScript, C# 같은 언어는 가비지 컬렉터를 이용해 메모리를 자동으로 정리하는 매니지드 언어(Managed Language)에 속합니다. 매니지드 언어의 가비지 컬렉터는 개발자가 메모리를 요청하면 운영체제의 힙 영역에 할당하고, 더 이상 필요하지 않을 때 자동으로 해제하며 메모리를 관리합니다.

여러분이 속한 회사에서 새로운 매니지드 언어를 개발 중이며, 여러분은 가비지 컬렉터 개발을 담당하게 되었습니다. 특히 메모리 검색 부분을 맡게 되었는데, 사용자가 특정 크기(Byte)의 메모리를 요청하면 사용 가능한 메모리 중 가장 적절한 크기를 찾아 반환하는 GarbageCollector 클래스를 구현해보세요.(같은 크기의 메모리는 없다고 가정)

풀이

구현 코드


import { AVLTree } from "./avlTree.mjs"

// 추상 자료형
// 빈 메모리 삽입 : insertFreeMemory
// 적당한 크기의 메모리 검색 : searchFreeMemory
// 사용될 빈 메모리 제거 : releaseFreeMemory

class GabageCollector{
    constructor(){
        this.avlTree = new AVLTree();
    }

// 빈 메모리 삽입
insertFreeMemory(size){
    this.avlTree.root = this.avlTree.insert(this.avlTree.root, size);
}

// 적당한 크기의 메모리 검색
searchFreeMemory(size){
    let currentNode = this.avlTree.root;
    let freeMemory = null;

    while(currentNode != null){
        if(currentNode.getData() == size){ // 딱 맞는 사이즈인 경우
            freeMemory = currentNode;
            break;
        } else if(currentNode.getData() > size){ // 요청 사이즈보다 더 큰 경우
            if(freeMemory && freeMemory.getData < currentNode.getData()){
                // freeMemory가 null이 아니고, currentNode보다 값이 작으므로 대치 X
                currentNode = currentNode.getLeftSubTree(); 
            } else{ // freeMemory를 currentNode로 대치
                freeMemory = currentNode;
                currentNode = currentNode.getLeftSubTree();
            }
        } else{ // 요청 사이즈보다 더 작은 경우
            currentNode = currentNode.getRightSubTree();
        }
    }
    console.log('freeMemory', freeMemory.getData()); // 검색 결과 확인용
    return freeMemory;
}

// 사용될 빈 메모리 제거
releaseFreeMemory(size){
    this.avlTree.root = this.avlTree.remove(this.avlTree.root, size);
}

}

const gc = new GabageCollector();
console.log("========== 빈 메모리 영역 초기화 ==========");
gc.insertFreeMemory(64); // 빈 64바이트 삽입
gc.insertFreeMemory(48); // 빈 48바이트 삽입
gc.insertFreeMemory(87); // 빈 87바이트 삽입
gc.insertFreeMemory(13); // 빈 13바이트 삽입
gc.insertFreeMemory(102); // 빈 102바이트 삽입
gc.insertFreeMemory(34); // 빈 34바이트 삽입
gc.insertFreeMemory(61); // 빈 61바이트 삽입
gc.insertFreeMemory(40); // 빈 40바이트 삽입
gc.insertFreeMemory(6); // 빈 6바이트 삽입

gc.avlTree.root.inOrderTraversal(gc.avlTree.root); // 트리 확인

let freeMemory1 = gc.searchFreeMemory(64); // 64바이트 메모리
console.log(freeMemory1);
if(freeMemory1){
    gc.releaseFreeMemory(freeMemory1.data);
}

let freeMemory2 = gc.searchFreeMemory(42); // 48바이트 메모리 획득
console.log(freeMemory2);
if(freeMemory2){
    gc.releaseFreeMemory(freeMemory2.data);
}

실행 결과

========== 빈 메모리 영역 초기화 ==========
6
13
34
40
48
61
64
87
102
freeMemory 64
BinaryTree {
  data: 64,
  leftSubTree: BinaryTree {
    data: 34,
    leftSubTree: BinaryTree {
      data: 13,
      leftSubTree: [BinaryTree],
      rightSubTree: null,
      height: 2
    },
    rightSubTree: BinaryTree {
      data: 48,
      leftSubTree: [BinaryTree],
      rightSubTree: [BinaryTree],
      height: 2
    },
    height: 3
  },
  rightSubTree: BinaryTree {
    data: 87,
    leftSubTree: null,
    rightSubTree: BinaryTree {
      data: 102,
      leftSubTree: null,
      rightSubTree: null,
      height: 1
    },
    height: 2
  },
  height: 4
}
freeMemory 48
BinaryTree {
  data: 48,
  leftSubTree: BinaryTree {
    data: 40,
    leftSubTree: null,
    rightSubTree: null,
    height: 1
  },
  rightSubTree: null,
  height: 2
}

 

답변 0