TIL

[2024.05.22] 알고리즘 심화반_배열 내부 동작 구현

_자몽 2024. 5. 22. 23:04

매일 알고리즘 문제 풀던 알고리즘 코드 카타가 수준반 분별 수업으로 바뀌었다. 때문에 실시간 수업이 하나 더 늘어서, 월요일에는 실시간 수업만 2개라 뭔가 더 바빠진 느낌이다.

 

※ Array 내부 동작 구현(자료구조)

심화반에서는 자료구조 위주로 실시간 수업을 진행하는데 첫 번째 과제로 클래스 문법으로 배열의 내부 동작을 구현하는 걸 내주셨다.

class FixedArray {
  #arrayLength;
  #array;
  // 필요한 변수 추가 가능
  #arrayIndex;

  // #arrayLength와 #array를 알맞게 초기화
  // 생성자 파라미터에는 FixedArray의 고정된 길이를 받아야됨.
  // #array초기화 시 각요소의 값은 undefined

  // 배열 생성시 올바른 0이상의 숫자 타입의 값만 들어온다는 것을 가정하였음
  constructor(length) {
    this.#arrayLength = length;
    this.#array = [];
    this.#arrayIndex = 0;
  }

  //////////////////////////////
  //////      LEVEL 1      /////
  //////////////////////////////
  // 배열 맨 뒤에 요소 추가
  // 배열의 길이가 #arrayLength를 초과할 경우 요소를 추가되면 안됨.
  push(element) {
    if (this.#arrayIndex === this.#arrayLength)
      throw new Error("배열의 길이 초과");
    this.#array[this.#arrayIndex++] = element;
  }

  // 배열의 맨 마지막 요소를 제거하고 그 요소를 반환
  pop() {
    if (this.#arrayIndex === 0)
      return new Error("빈 배열임으로 pop()을 실행할 수 없음");
    return this.#array[--this.#arrayIndex];
  }

  // 현재 배열의 사용되고 있는 크기를 반환
  getLength() {
    return this.#arrayIndex;
  }

  // 현재 배열의 상태를 string으로 반환
  stringify() {
    if (this.#arrayIndex === 0)
      return new Error("빈 배열임으로 stringify()를 실행할 수 없음");

    let strArray = "[";
    for (let i = 0; i < this.#arrayIndex; i++) {
      strArray += i === 0 ? `${this.#array[i]}` : `, ${this.#array[i]}`;
    }
    return strArray + "]";
  }
}

// SUCCESS 테스트 케이스, 주석처리 된 부분은 해당 위치에서 ERROR CASE
// Error에 대해선 모두 예외 처리하여 오류 발생
const array = new FixedArray(3);
array.push(1);
array.push(2);
array.push(3);
// array.push(4);
console.log(`배열의 길이: ${array.getLength()}`);
console.log(`stringify() 실행 결과: ${array.stringify()}`);

console.log(`pop()으로 반환된 값: ${array.pop()}`);
console.log(`pop()으로 반환된 값: ${array.pop()}`);
console.log(`pop()으로 반환된 값: ${array.pop()}`);
// console.log(array.pop());

// console.log(array.stringify());

 

실행 결과

지금에 와서 완성된 코드를 보면 '당연히 써져있는 코드대로 작동하면 이렇게 되겠구나'라는 생각이 들지만, 막상 처음 구현할 때는 '배열이 어떻게 생성되지?', 'pop()을 하면 어떤 동작을 넣어야 할까?'와 같이 동작 원리를 한 번 더 고민해 볼 수 있었던 시간이었다.