데브코스 3일차 TIL: 자료구조 & 알고리즘

te-ing·2021년 8월 4일
3

3일차 강의는 그동안 코딩테스트를 위해 아무 생각없이 쓰던 API들이 어떤 식으로 이루어지는지 배우는 강의였다. 효율적인 메모리관리와 빠른 동작수행을 위해서 API의 사용방식도 알아야 할 필요를 느꼈다.

그런데 이론만 공부하다가 막상 코딩테스트로 알고리즘을 구현하려 하니, 오랜 시간이 걸릴 뿐더러 몇 시간을 붙잡고 있어도 풀리지가 않는 것들이 있었다...😥

때문에 시간이 없다는 핑계로 자꾸 주말로 미루고 있는데, 과제를 하다보니 더 공부해봐야 할 것들이 생겼다. 주말에 에러와 예외처리에 관해서도 정리해봐야겠다!🤣


SinglyLinkedList 과제

  class Node { // 노드생성
    constructor(value) {
      this.value = value; // 노드 데이터영역
      this.next = null; // 다음 노드를 가르키는 포인터영역
    }
  }
  class SinglyLinkedList { // 노드를 엮어주는 역할
    constuctor() {
      this.head = null; 
      this.tail = null;
    }
  

    find(value) { // 노드 탐색
      let currNode = this.head;
      while (currNode.value !== value) { 
        currNode = currNode.next; // 노드를 찾을때까지 다음 노드로 이동
      }
      return currNode;
    }

    append(newValue) { // 끝부분 노드 추가
      const newNode = new Node(newValue); // 노드 생성
      if (this.head == null) { // 연결될 노드가 없다면 head와 tail은 자신
        // undefined 로 떠서 == 으로 수정함.. 맞는건가??????????????????????
        this.head = newNode;
        this.tail = newNode;
      } else {
        this.tail.next = newNode; // 테일포인터를 새로 생성된 노드를 가르키게 함
        this.tail = newNode; // 새로 생성된 노드를 테일로 지정
      }
    }
    
    insert(node, newValue) {
      const newNode = new Node(newValue); // 노드 생성
      newNode.next = node.next; // 생성된 노드의 다음을 입력받은 노드의 다음을 가르키도록 설정
      node.next = newNode; // 입력받은 노드의 다음을 생성된 노드를 가르키면서, 생성된 노드를 중간에 끼워넣음
    }

    remove(value) {
      let prevNode = this.head; // 삭제할 값 탐색
      while (prevNode.next.value !== value) {
        prevNode = prevNode.next;
      }
      if (prevNode.next !== null) { // 삭제할 값을 찾으면
        prevNode.next = prevNode.next.next; // 이전 노드에서 삭제할 값에게 향하는 포인터를, 다음 노드로 향하게 함
      } // 포인터를 받지 못하는 노드는 가비지컬렉터가 삭제
    }

    display() {
      let currNode = this.head; // 현재 노드는 head
      let displayString = "[";
      while (currNode !== null) {
        displayString += `${currNode.value}, `; // 노드값 추가
        currNode = currNode.next; // 다음 노드로 이동
      }
      displayString = displayString.substr(0, displayString.length-2);  // 뒤에 2글자 삭제
      displayString += "]"
      console.log(displayString);
    }

    size() { // size 메서드 구현
      let currNode = this.head; // 현재 노드는 head
      let size = 1;
      if (this.head == null) { // 노드가 없다면 0 리턴
        return 0;
      }
      while (currNode !== this.tail) { 
        size++;
        currNode = currNode.next; // 다음 노드로 이동
      }
      return size
    }
  }
profile
프론트엔드 개발자

0개의 댓글