[TIL] 240426 (시간 복잡도와 공간 복잡도, 배열과 링크드리스트, 클래스와 클로저)

·2024년 4월 26일

TIL

목록 보기
23/268

🥞 오늘 한 일

  • JavaScript 문법 종합반
    • 5주차 완료
    • 3주차 2회독 진행중(3-1 ~ 3-9)
  • 알고리즘 특강 (09:00, 강창민 튜터님)
  • 알고리즘 코드카타
    • 평균 구하기
    • 자릿수 더하기
    • 약수의 합
    • 나머지가 1이 되는 수 찾기
    • x만큼 간격이 있는 n개의 숫자
    • 자연수 뒤집어 배열로 만들기
    • 문자열을 정수로 바꾸기
    • 정수 제곱근 판별

🍽️ 문제 해결

간단한 문제들

터미널 입력 모드에서 빠져나오기

맥북으로 바꾸고 git을 처음 쓰는거라, 이름 및 이메일 설정을 안 했더니 터미널에 다음과 같이 나왔다.

name, email을 모두 입력했는데, 여기서 빠져나오는 방법을 몰랐다. 그래서 전에 배웠던 감으로 esc 및 :wq를 입력해서 빠져나왔다. 문제는 해결하긴 했지만 이에 대한 개념이 없어서, 아래 '새로 알게된 것'에 이에 대한 개념을 정리했다.

🍪 새로 배운 것

알고리즘 강의 3일차 정리

오늘 배울 것

  • 시간 복잡도
    • 최악의 경우를 가정하여 정량화하는 방법
    • 알지 못하면 알고리즘을 고안해도 이 방법이 정말 유용한지 판단하기 힘들다.
  • 공간 복잡도 (잘 언급되는 부분은 아님)
    • 시간 복잡도에 비해서는 크게 중요치 않다.
      • 물론 최적화하면 당연히 좋긴 하다.
  • 배열과 링크드리스트에 대해 배워볼 것이다.

시간 복잡도

  • 최악의 경우를 기준으로 계산
  • 문제를 해결하는데 걸리는 시간과 입력의 함수 관계를 가리킨다.
  • 시간 복잡도는 Big-O(빅오) 표기법으로 표시한다.

공간 복잡도

  • N개의 입력이 주어지면 공간을 얼마나 쓰는지 나타내는 것.
  • 지나치게 공간을 헤프게 쓰는 것에 대해 주의만 해주면 된다.
  • 알고리즘의 성능 향상을 위해 공간을 필수적으로 더 사용해야 한다면 주저하지 말아라!

배열

  • 연속적인 공간에 저장이 되어야 한다.
  • 반복문과 결합이 잘 된다.
  • 다만 자바스크립트에서는 연속적인 메모리 공간으로 배열의 내용들이 관리되지 않는다.
  • 배열에서 할 수 있는 대표적인 기능
    • 조회
      • O(1)의 조회 시간을 가진다는 매우 큰 장점이 있다.
      • 무조건 한 번에 상수적으로 값을 조회를 할 수 있다는 얘기다. 인덱스 값을 받으면 해당하는 배열의 값을 바로 리턴하니까.
    • 삽입 & 삭제
      • 배열 끝에서 추가 및 삭제는 O(1)
        • 배열 끝이 아닌 다른 곳에서 원소를 삽입 혹은 삭제 할 경우에는 O(n).
    • 정렬
      • 어떤 정렬 알고리즘을 사용하느냐에 따라 시간 복잡도가 다 다르게 나온다.
    • 검색
      • 일반적으로는 O(N)이다. 첫 원소부터 끝 원소까지 다 보기 때문.

링크드리스트

  • 화물 칸을 중간에 붙일 수 있는 열차처럼, 유동적으로 연결고리를 떼었다가 붙였다가 할 수 있는 자료구조
  • 링크드리스트 용어 설명
    • 노드
      • 각 화물 칸들을 노드라고 함.
      • 맨 앞의 노드가 Head, 맨 뒤의 노드가 Tail(포인터가 NULL)
    • 포인터
      • 현재 노드가 가리키는 다음 화물 칸.
  • 배열이 빠르게 값을 갖고 오는 것이 장점이라면, 링크드리스트는 원소의 삽입/삭제에 강점이 있는 자료구조.
  • 삽입/삭제에 강점이 있는 대신에 조회에는 다소 약하다.
    • 특정 노드가 어디있는지 알아내려면, 최초 노드부터 연결고리를 타고 또 타야한다.
    • 시간 복잡도로 나타내면 조회 성능은 O(N).

한줄 요약

  • 인덱스를 알고 있다는 전제.
  • 배열
    • 데이터를 빈번하게 접근해야 될 때 쓴다.
  • 링크드리스트
    • 데이터를 빈번하게 삽입/삭제해야 될 때 쓴다.

그 외 배운 것

  • JavaScript 문법 종합반 5주차
    • 클래스(상속, 정적 메소드), 클로저
  • 숫자열에서 바로 배열로 만들 수 없다. iterable인 문자열로 변환한 뒤 배열로 변환할 수 있다.
  • Array.map(Number) : 배열 내의 문자열인 숫자들을 숫자열로 바꿔준다.
  • Math.sqrt() : 제곱수 판별 메서드
  • overriding : 클래스에서 부모에게서 내려받은 메서드를 재정의하는 것. (면접 단골 질문 중 하나)
  • 터미널 입력 모드에서 빠져나오기
    • esc : 명령 모드로 전환하기
    • :w : 저장하기
    • :q : 종료하기
    • :wq : 저장하면서 종료하기

🍴 느낀 점

  • 어제에 비해 훨씬 집중이 잘 되는 날이었어서 좋았다. 맥북에도 나름대로 익숙해져가고 있고, 강의도 집중해서 대부분 잘 이해해낸 것 같다.
  • 간단한 문제처럼 보일수록 기록을 더 성실히 해야겠다고 생각했다. 이 정도야 뭐 나중에는 바로 해결하겠지~ 라고 생각해도 막상 다시 똑같은 문제에 직면하면 해결하지 못할 때가 있다. 기록을 하면서 기억에 더 남을 수 있기 때문에, 앞으론 해결한 문제를 적는 것에 더 많이 투자해야겠다.
  • JavaScript 문법 종합반 3주차부터 2회독하고 있는데, 처음에는 목표한 대로 정리를 하면서 했는데 영 도움이 되는 것 같지 않고 산만해지는 것 같다. 그래서 일단 실행 컨텍스트부터는 정리를 중단했고, 나에게 맞는 방법을 조금 더 찾아봐야겠다.

🍳 내일 할 일

  • 알고리즘 코드카타
  • JavaScript 문법 종합반 3주차 2회독 남은 부분
profile
웹 프론트엔드 개발자

0개의 댓글