😎
Onemorebottlee's TIL
  • 🤓Introduce
  • 📖DevLog
    • 💣Error
      • npm ERR! Cannot read properties of null (reading 'edgesOut')
      • git
        • src refspec main does not match any
      • NextJS
        • No img element
        • ReferenceError : document is not defined
        • `next/image` Un-configured Host
  • 📺Lecture
    • Nomad Coders
      • 초보자를 위한 리덕스 101
        • #0 Introduction
        • #1 PURE REDUX: COUNTER
        • #2 PURE REDUX: TO DO LIST
        • #3 REACT REDUX
        • #4 Redux Toolkit
      • 바닐라 JS로 그림 앱 만들기
      • React JS 마스터 클래스
        • #2 Styled Componnents
        • #3 TypeScript
        • #4 Crypto Tracker
        • #5 State Management
        • #6 Trello
        • #7 ANIMATIONS
      • Next.js 시작하기
        • #0 INTRODUCTION
        • #1 FRAMEWORK OVERVIEW
        • #2 PRACTICE PROJECT
      • Typescript로 블록체인 만들기
        • #1 Introduction
        • #2 Overview of TypeScript
        • #3 Functions
        • #4 Classes and Interfaces
        • #5 TypeScript Blockchain
      • SQL Master Class
        • #1 Introduction
        • #2 SQLite
        • #3 Data Definition Language
        • #4 Data Manipulation Language
        • #5 Subqueries and CTEs
        • #6 Indexes
        • #7 MySQL
        • #8 Foreign Keys
        • #9 JOINS
        • #10 Nomalization
        • #11 Events & Triggers
        • #12 Full-Text Indexes
        • #13 PostgreSQL
        • #14 Functions And Procedures
        • #15 Transactions
        • #16 Data Control Language
        • #17 PostgreSQL JSON Columns
        • #18 PostgreSQL Extensions
        • #19 MongoDB
        • #20 REDIS
        • #21 Javascript and Python Drivers
    • Udemy
      • TypeScript 마스터 with Webpack & React
        • [S1] 소개
        • [S2] 설치 및 설정
        • [S3] 타입 애너테이션 기초
        • [S4] 함수
        • [S5] 객체 타입
        • [S6] 배열 타입
        • [S7] 유니온타입
        • [S8] Tuple & Enum
        • [S9] 인터페이스
        • [S10] TypeScript 컴파일러
        • [S11] 미니 프로젝트 DOM, 타입 단언, 그리고 더 많은 내용
        • [S12] Class
        • [S13] TS Class
        • [S14] Generics ⭐⭐⭐⭐⭐
        • [S15] Narrowing
        • [S16] Type Declarations
        • [S17] Module
        • [S18] Webpack 과 TypeScript
        • [S19] React
    • 모두를 위한 컴퓨터 과학 CS50
      • 1. 컴퓨팅 사고
      • 2. C언어
      • 3. 배열
      • 4. 알고리즘
      • 5. 메모리
      • 6. 자료구조
    • 생활코딩
      • DATABASE
        • DATABASE1
  • 📚Book
    • 모던 자바스크립트 Deep Dive
      • 1장 프로그래밍
      • 2장 자바스크립트란?
      • 3장 자바스크립트 개발 환경과 실행 방법
      • 4장 변수
      • 5장 표현식과 문
      • 6장 데이터 타입
      • 7장 연산자
      • 8장 제어문
      • 9장 타입 변환과 단축 평가 ⭐⭐⭐
      • 10장 객체 리터럴
      • 11장 원시 값과 객체의 비교
      • 12장 함수 ⭐⭐⭐⭐
      • 13장 스코프
      • 14장 전역 변수의 문제점
      • 15장 let, const 키워드와 블록 레벨 스코프 ⭐⭐⭐
      • 16장 프로퍼티 어트리뷰트
      • 17장 생성자 함수에 의한 객체 생성
      • 18장 함수와 일급 객체 ⭐⭐
      • 19장 프로토타입 ⭐⭐⭐⭐⭐
      • 20장 strict mode
      • 21장 빌트인 객체 ⭐
      • 22장 this ⭐⭐⭐
      • 23장 실행 컨텍스트 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 24장 클로저 ⭐⭐⭐⭐⭐⭐⭐
      • 25장 클래스
      • 26장 ES6 함수의 추가 기능
      • 27장 배열 ⭐⭐⭐
      • 28장 Number
      • 29장 Math
      • 30장 Date
      • 31장 RegExp
      • 32장 String
      • 33장 7번째 데이터 타입 Symbol
      • 34장 이터러블
      • 35장 스프레드 문법
      • 36장 디스트럭처링 할당
      • 37장 Set과 Map
      • 38장 브라우저의 렌더링 과정⭐⭐⭐⭐⭐⭐⭐⭐
      • 39장 DOM ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 40장 이벤트⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 41장 타이머
      • 42장 비동기 프로그래밍 ⭐⭐⭐⭐⭐⭐⭐⭐
      • 43장 Ajax
      • 44장 REST API
      • 45장 프로미스
      • 46장 제너레이터와 async/await
      • 47장 에러 처리
      • 48장 모듈
      • 49장 Babel과 Webpack을 이용한 ES6+/ES.NEXT 개발 환경 구축
    • 러닝 타입스크립트
      • Ch.1 자바스크립트에서 타입스크립트로
      • Ch.2 타입 시스템
      • Ch.3 유니언과 리터럴
      • Ch.4 객체
      • Ch.5 함수
      • Ch.6 배열
      • Ch.7 인터페이스
      • Ch.8 클래스
      • Ch.9 타입 제한자
      • Ch.10 제네릭
      • Ch.11 선언 파일
      • Ch.12 IDE 기능 사용
      • Ch.13 구성 옵션
      • Ch.14 구문 확장
      • Ch.15 타입 운영
      • 용어 사전
    • 자바스크립트 완벽 가이드
    • SQL in 10 Minutes
      • 1장 SQL 이해하기
      • 2장 데이터 가져오기
      • 3장 가져온 데이터 정렬하기
      • 4장 데이터 필터링
      • 5장 고급 데이터 필터링
      • 6장 와일드카드 문자를 이용한 필터링
      • 7장 계산 필드 생성하기
      • 8장 데이터 조작 함수 사용하기
      • 9장 데이터 요약
      • 10장 데이터 그룹핑
      • 11장 서브쿼리 사용하기
      • 12장 테이블 조인
      • 13장 고급 테이블 조인 생성하기
      • 14장 쿼리 결합하기
      • 15장 데이터 삽입하기
      • 16장 데이터 업데이트와 삭제
      • 17장 테이블 생성과 조작
      • 18장 뷰 사용하기
      • 19장 저장 프로시저 사용하기
      • 20장 트랜잭션 처리 관리하기
      • 21장 커서 사용하기
      • 22장 고급 데이터 조작 옵션
    • 면접을 위한 CS 전공지식 노트
      • 4 데이터베이스
        • 4.1 데이터베이스의 기본
    • 2023 이기적 SQL 개발자 이론서 + 기출문제
      • 데이터 모델링 이해
        • S1. 데이터 모델링
  • 💻Study
    • CS 지식 발표
      • 1회차
      • 2회차
      • 3회차
      • 4회차
      • 5회차
      • 6회차
      • 7회차
      • 8회차
      • 9회차
    • TypeScript Exercises
      • Ex 1
      • Ex 2
      • Ex 3
      • Ex 4
      • Ex 5
      • Ex 6
      • Ex 7
      • Ex 8
      • Ex 9
      • Ex 10
  • 🔄ETC
    • Article
      • Atomic Design Pattern
      • 프론트엔드 개발자
    • DATABASE
      • Oracle
        • CEIL() & FLOOR() - 소수점 올림 & 내림
        • DUAL 테이블 - 임시 테이블로 결과 확인하기
    • Ubuntu
      • 어플리케이션 업데이트
Powered by GitBook
On this page
  • 1) malloc과 포인터 복습
  • 2) 배열의 크기 조정하기
  • 3) 연결리스트 : 도입
  • 4) 연결리스트 : 코딩
  • 5) 연결리스트 : 시연
  • 6) 연결리스트 : 트리
  • 7) 해시 테이블
  • 8) 트라이
  • 9) 스택, 큐, 딕셔너리

Was this helpful?

  1. Lecture
  2. 모두를 위한 컴퓨터 과학 CS50

6. 자료구조

Previous5. 메모리Next생활코딩

Last updated 1 year ago

Was this helpful?

1) malloc과 포인터 복습

C언어는 변수 x와 y를 선언하고, 데이터 크기를 설정한 후 값을 할당한다.

이때, 데이터 크기를 설정하는 메모리 주소를 같은 값으로 설정하면 나중에 넣는 값으로 덮히게 된다.

메모리 주소를 복사하는 것은 주의가 필요하다.

2) 배열의 크기 조정하기

realloc 함수를 사용해 배열의 크기를 조정할 수 있다.

3) 연결리스트 : 도입

데이터 구조는 컴퓨터 메모리를 효율적으로 관리하기 위해 새로 정의하는 구조체로, 일종의 메모리 레이아웃, 지도이다.

연결 리스트 ㄴ 각 인덱스의 값이 메모리상에서 연이어 저장되어 있는 배열과 달리 각 값이 메모리상의 여러 군데 나뉘어져 있지만 바로 다음 값의 메모리 주소를 기억하고 있어 값은 연이어 읽어들일 수 있다.

마지막 값은 NULL을 저장한다.

장점 - 연속적인 메모리 공간이 필요하지 않아 효율적이고, 데이터 수정이 용이하다.

단점 - 배열에 비해 접근성이 부족하고, 메모리 주소 값도 저장하기에 상대적으로 메모리 공간 사용량이 증가한다.

4) 연결리스트 : 코딩

list가 끊어지지 않게 코딩하는것이 중요하다. 끊어진 메모리는 다시 찾을 수 없기에

#include <stdio.h>
#include <stdlib.h>

//연결 리스트의 기본 단위가 되는 node 구조체를 정의합니다.
typedef struct node
{
    //node 안에서 정수형 값이 저장되는 변수를 name으로 지정합니다.
    int number; 

    //다음 node의 주소를 가리키는 포인터를  *next로 지정합니다.
    struct node *next;
}
node;

int main(void)
{
    // list라는 이름의 node 포인터를 정의합니다. 연결 리스트의 가장 첫 번째 node를 가리킬 것입니다. 
    // 이 포인터는 현재 아무 것도 가리키고 있지 않기 때문에 NULL 로 초기화합니다.
    node *list = NULL;

    // 새로운 node를 위해 메모리를 할당하고 포인터 *n으로 가리킵니다.
    node *n = malloc(sizeof(node));
    if (n == NULL)
    {
        return 1;
    }

    // n의 number 필드에 1의 값을 저장합니다. “n->number”는 “(*n).numer”와 동일한 의미입니다. 
    // 즉, n이 가리키는 node의 number 필드를 의미하는 것입니다. 
    // 간단하게 화살표 표시 ‘->’로 쓸 수 있습니다. n의 number의 값을 1로 저장합니다.
    n->number = 1;

    // n 다음에 정의된 node가 없으므로 NULL로 초기화합니다.
    n->next = NULL;

    // 이제 첫번째 node를 정의했기 떄문에 list 포인터를 n 포인터로 바꿔 줍니다.
    list = n;

    // 이제 list에 다른 node를 더 연결하기 위해 n에 새로운 메모리를 다시 할당합니다.
    n = malloc(sizeof(node));
    if (n == NULL)
    {
        return 1;
    }

    // n의 number와 next의 값을 각각 저장합니다.
    n->number = 2;
    n->next = NULL;

    // list가 가리키는 것은 첫 번째 node입니다. 
    //이 node의 다음 node를 n 포인터로 지정합니다.
    list->next = n;

    // 다시 한 번 n 포인터에 새로운 메모리를 할당하고 number과 next의 값을 저장합니다.
    n = malloc(sizeof(node));
    if (n == NULL)
    {
        return 1;
    }

    n->number = 3;
    n->next = NULL;

    // 현재 list는 첫번째 node를 가리키고, 이는 두번째 node와 연결되어 있습니다. 
    // 따라서 세 번째 node를 더 연결하기 위해 첫 번째 node (list)의 
    // 다음 node(list->next)의 다음 node(list->next->next)를 n 포인터로 지정합니다.
    list->next->next = n;

    // 이제 list에 연결된 node를 처음부터 방문하면서 각 number 값을 출력합니다. 
    // 마지막 node의 next에는 NULL이 저장되어 있을 것이기 때문에 이 것이 for 루프의 종료 조건이 됩니다.
    for (node *tmp = list; tmp != NULL; tmp = tmp->next)
    {
        printf("%i\\n", tmp->number);
    }

    // 메모리를 해제해주기 위해 list에 연결된 node들을 처음부터 방문하면서 free 해줍니다.
    while (list != NULL)
    {
        node *tmp = list->next;
        free(list);
        list = tmp;
    }
}

5) 연결리스트 : 시연

연결 리스트는 새로운 값을 추가할 때 메모리를 다시 할당하지 않아도 되지만, 임의 접근이 불가능하다. 이처럼 데이터 구조에는 장점과 단점이 존재하기에 각 데이터 구조별 특징을 알고 사용해야 한다.

6) 연결리스트 : 트리

트리는 연결리스트를 기반으로 한 데이터 구조이다.

연결리스트의 각 노드의 1차원적인 연결을 2차원으로 구성하면 트리가 된다.

각 노드는 일정한 층에 속하고, 다음 층의 노드를 가리키는 포인터를 갖는다.

가장 상단에 트리가 시작되는 노드를 ‘루트’라고 한다. 루트 노드는 다음 층의 노드를 가리키고 이를 ‘자식 노드’라고 한다.

위 그림의 트리는 이진 검색 트리로 규칙에 의해 구성되어 있다.

균형이 이루어져 있다면 이진 검색과 삽입이 O(log n)으로 가능해 효율적이다.

하지만 메모리 크기가 크다는 단점이 있고, 트리의 균형이 맞지 않으면 똑같기에 균형을 맞추는 알고리즘이 추가로 필요하다.

7) 해시 테이블

해시 테이블은 연결 리스트의 배열이다.

각 값들은 해시 함수라는 맞춤형 함수를 통해 새롭게 정의되는 연결 리스트로 이어진다.

결국 연결 리스트가 여러개 있는 연결 리스트의 배열이 된다.

이상적인 해시 함수가 있다면 O(1)

그렇지 않다면 O(n)

8) 트라이

트라이는 각 노드가 배열로 이루어진 트리 형태의 자료 구조이다.

속도는 빠르지만 메모리를 많이 사용한다.

9) 스택, 큐, 딕셔너리

스택은 값이 위로 쌓이는 구조이다.

후입선출, LIFO 방식을 따르며, 가장 나중에 온 값이 가장 먼저 나가는 뷔페 접시와 같다.

배열이나 연결 리스트를 통해 구현 가능하다.

큐는 값이 아래로 쌓이는 구조를 말한다.

선입선출, FIFO 방식을 따르며, 먼저 들어온 값이 먼저 나가는 줄서기와 같다.

배열이나 연결 리스트를 통해 구현 가능하다.

딕셔너리는 키와 값이라는 요소로 이루어져 있다.

키에 해당하는 값을 저장하고 읽는다. 일반적으로 해시 테이블과 동일한 개념이다.

📺