Post

(TIL) 2024-11-14

(TIL) 2024-11-14

알고리즘

  1. 시간 복잡도
    • 이중 for문 : N x N의 시간이 소요
    • 단일 for문 : N의 시간이 소요
  2. 공간 복잡도

  3. 배열
    • javascript에서는 연속적인 메모리 공간으로 관리되지 않는다. (다른 정적 언어는 크기 지정)
  4. 링크드리스트
    • 유동적으로 연결고리를 떼었다가 붙였다가 할 수 있는 자료구조
    • 원소의 삽입/삭제에 강점
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  class LinkedList {
    constructor(value) {
      this.head = new Node(value); // head 에 시작하는 Node 를 연결합니다.
    }

    // LinkedList 가장 끝에 있는 노드에 새로운 노드를 연결합니다.
    append(value) {
      let curr = this.head;
      while (curr.next !== null) { // curr의 다음이 끝에 갈 때까지 이동합니다. 
        curr = curr.next;
      }
      curr.next = new Node(value);
    }

    getNode(index) {
      let node = this.head; // 링크드리스트의 Head를 처음 노드로 지정합니다!
      for (let i = 0; i < index; i++) {
        node = node.next; // 원하는 위치에 당도할 때 까지 다음 노드로 이동!
      }
      return node;
    }

    addNode(index, value) {
      // ["자갈"] -> ["흑연"] -> ["밀가루"] -> ["우편"]
      // 이때까지는, this.head = ["자갈"]
      // ["짱짱"]이라는 친구를 0번째 index로 추가
      // ["짱짱"] -> ["자갈"]
      // this.head = ["짱짱"]
      // ["짱짱"] -> ["자갈"] -> ["흑연"] -> ["밀가루"] -> ["우편"]
      const newNode = new Node(value); // 일단 새로운 값을 기준으로 새 노드를 만들어요!
      if (index === 0) { // 0번째에 추가를 하고 싶다면!
        newNode.next = this.head; // 원래 Head였던 노드를 새 노드의 next로 지정해요!
        this.head = newNode; // 그리고, Head를 새 노드로 바꾸어줍니다!
        return;
      }

      // [3] - [4] - [5]에서 [3] - [4] - [6] - [5]로 6을 중간에 넣는다고 할게요!
      // 추가하고 싶은 index의 이전 노드 정보를 갖고옵니다! 여기선 [4] 입니다.
      const node = this.getNode(index - 1);
      // 1. 이전 노드([4])의 포인터([5])를 next_node로 임시 저장해요!
      const nextNode = node.next;
      // [4] -> [6]
      // 2. 이전 노드([4])의 포인터를 [6]으로 지정합니다!
      node.next = newNode;
      // [6] -> [5]
      // 3. 새로 삽입한 노드([6])의 포인터를 next_node인 [5]으로 지정합니다!
      newNode.next = nextNode;
    }
  }

트러블 슈팅

  1. 배경
    • 현재 게임에서 로그 정보를 배열로 관리하고 있다. 자꾸 늘어나면 무한으로 내려가니 일정 이상이 차면 첫번째의 로그를 삭제하고 추가하는 함수를 만들었다.
      1
      2
      3
      4
      5
      6
      
      export function logsPush(logs, row) {
      //logs의 10개 이상일 경우 첫 로그 삭제 후 추가
      const maxRow = 10;
      if (logs.length >= maxRow) logs.shift();
      logs.push(row);
      }
      
    • 그리고 아래와 같이 해당 함수를 호출하여 로그를 관리했다.
      1
      
      logsPush(logs, chalk.white(`[Wave:${stage}] 몬스터 ${spawnCnt} 마리가 등장하였습니다.`));
      
  2. 발단
    • 로그를 출력하는 부분에서 maxCol사이즈에서 Length만큼 계산해서 가변적으로 출력하는 부분이 있어서 로그 텍스트의 length가 이상한 것을 확인.
      1
      2
      
      console.log(logs[0].length); //37
      console.log("[Wave:1] 몬스터 6 마리가 등장하였습니다."); //27
      
  3. 전개
    • 그래서 확인해보기 위해서 for문으로 돌려보았다.
      1
      2
      3
      4
      
      let b = chalk.white('[Wave:1] 몬스터 6 마리가 등장하였습니다.');
      for (let i = 0; i < b.length; i++) {
      console.log(b[i]);
      }
      
    • 그랬더니 콘솔 결과창에 아래와 같이 문자열 앞뒤로 공백이 5개씩 있는 것을 확인.
      1
      
      [Wave:1]몬스터 6 마리가 등장하였습니다.      
      
  4. 결말
    • 저렇게 글자 하나하나 찍었을때 chalk.white()가 오류가 발생안되고 length에 잡힌게 신기했다.
      chalk.white뿐만 아니라 red, whiteBright로 바꿔서 해보니 똑같이 앞뒤로 5개씩 공백이 찍혔다.

기타 작업 게시물 링크

프로젝트 관련 작업

  1. Display Status 영역 작업.

오늘의 주저리

  1. 코드카타
    • 오늘 코드카타를 통해서 새로이 알게된 것은 join 함수. 배열의 각 요소를 구분자로 연결해준다. split과 반대되는 함수다.
  2. 프로젝트
    • 어느덧 벌써 목요일. 정말 얼마 안남았다. 현재 목표 완성도는 70%정도? 인듯. 아직도 구현할게 많다…
This post is licensed under CC BY 4.0 by the author.