티스토리 뷰
[1] 배열
(1) 배열 : 같은 자료형의 데이터들을 하나의 변수로 정의, 각 인덱스위 값이 메모리상에서 연이어 저장됨
array = | int | int | int | int |
* 파이썬은 서로 다른 자료형의 데이터들도 하나의 변수로 정의할 수 있다.(= list)
(2) 배열의 크기 조정 : realloc
일정한 크기의 배열이 주어졌을때, 그 크기를 확장하기 위해서는 새로운 공간에 큰 크기의 메모리를 다시 할당하고 값을 복사해야 한다
malloc (메모리 할당) | realloc (배열 크기 조정) |
#include <stdio.h> // printf를 쓰기 위해 헤더파일 추가 #include <stdlib.h> // malloc을 사용하기위해 헤더파일 추가 int main(void) { int *list = malloc (3*sizeof(int)); if(list == NULL) // 만약 메모리가 다 차서 할당하지 못하게 되면 { // 프로그램을 끝내라 return 1; } list[0] = 1; list[1] = 2; list[2] = 3; |
|
// 배열의 크기를 3 → 4로 변경하고 싶음 // 바로 list에 malloc을 사용하면 이전에 쓰던 메모리들은 포인터를 잃고 떠돌아 다니게 됨(메모리 낭비) int * temp = malloc(4* sizeof(int)); if(temp == NULL) // 포인터가 잘 선언되었는지 확인 { return 1; } // old 배열에서 new 배열로 정수 값 복사 for (int i = 0; i<3; i++) { tmp[i] = list[i]; } tem[3] = 4; free(list); // list의 메모리 할당 해제 list = tmp; // 원래 포인터 이름을 그대로 쓰기 위해 for (int i=0; i<4; i++) { printf("%i\n", list[i]); } free(list); } |
// tem포인터에 메모리를 할당하고 list값 복사 int * temp = realloc(list, 4* sizeof(int)); if(temp == NULL) { return 1; } // list가 tmp와 같은 곳을 가리키도록 지정 list = temp; // 새로운 list의 네번째 값 저장 list[3] = 4; //list의 값 확인 for (int i=0; i<4; i++) { printf("%i\n", list[i]); } // list의 메모리 초기화 free(list); } |
출력결과 1 2 3 4 |
[2] 연결리스트
(1) 연결리스트 : 각 인덱스의 메모리 주소에서 자신의 값과 함께 바로 다음 값의 주소(포인터)를 저장하므로써 연결
크기가 3인 연결리스트는 자신의 값과 함께 바로 다음 값의 주소(포인터)를 저장 |
typedef struct node(x같은거로 바꿀수 O, 구조체의 정식 명칭) { int number; struct node(x같은거로 바꿀수O) *next; } node(구조체의 별명, 프로그램의 다른부분에서 사용하기 쉽게); |
||
1 주소: 0x123 |
|||
0x456 → | 2 주소: 0x456 |
||
↑이 두칸을 하나의 node라고 함 | 0x789 → | 3 주소: 0x789 |
|
↑이 두칸을 하나의 node라고 함 |
NULL (포인터) (16진법으로 0, \0인 NUL과는 다름) |
||
↑ 이 두칸을 하나의 node라고 함 |
* 연결리스트 구현해보기
node | node | node | node |
list | 2 | 4 | 5 |
→ 2를 가리킴 | → 4 를 가리킴 | → 5를 가리킴 | |
// 비어있는 연결 리스트 구현 // NULL이기 때문에 화살표가 아직 안들어가있음 node *list = NULL; node *n = malloc(sizeof(node)); // malloc이 주소를 반환 // n이 node를 저장할 수 있는 크기의 메모리 덩어리를 가리키도록 만듬 즉, n은 node를 가리키는 포인터(n은 node*로 나타낼 수 있는 node 포인터, n은 node의 주소라는 뜻) // 그래서 n은 포인터이므로 n.number라고 못쓰고 n->number를 쓰는거임 if( n! = NULL) { n -> number = 2; // (*n).number = 2; 와 같은 의미 // 이제 2 값에 다음 node의 주소를 적어줘야함 // 근데 다음 node가 없음 n->next = NULL; } // node n을 list에 연결 list = n; node *n = malloc(sizeof(node)); if( n! = NULL) { n -> number = 4; n->next = NULL; } node *tmp = list; while (tmp -> next != NULL) // 가리키는 곳이 널이 아니면 다음 코드를 실행해라 } { tmp = tem-> next; } |
|||
* list에 1 값을 앞에 넣고 싶은 경우, 3값을 중간에 넣고 싶은 경우 | |||
node | node | node | node |
list | 2 | 4 | 5 |
→ ② ↓ 1을 가리키게 함 |
→ ② ↓ 3을 가리키게 함 |
→ 5 를 가리킴 | |
node | node | ||
1 | 3 | ||
① ↗ 2를 가리키게 함 | ① ↗ 4 를 가리키게함 | ||
n -> next = list; list = n; 최종적으로 list → 1 → 2 → 3 → 4 → 5 이 과정에서 반복문과 대소비교, 포인터를 업데이트 하는 과정이 필요하다. 따라서 맨앞에 추가하는 것이 가장 쉽고, 맨뒤에추가하는것 그리고 중간에 추가하는거 순으로 점점 어려워진다. |
(2) 트리
- 연결리스트를 기반으로 한 새로운 데이터 구조
- 연결리스트에서의 각 노드들의 연결이 1차원적으로 구성되어 있다면, 트리에서의 노드들의 연결은 2차원적으로 구성되어 있다고 볼 수 있다
[3] 해시테이블
- 연결 리스트의 배열
- 여러 값들을 몇 개의 바구니에 나눠 담는 상황에서 각 값들은 '해시 함수'라는 맞춤형 함수를 통해 어떤 바구니에 담지는 지가 결정된다. 각 바구니에 담기는 값들은 그 바구니에서 새롭게 정의되는 연결 리스트로 이어진다.
- 이상적인 경우 각 바구니에는 단 하나의 값들만 담기게 될 것이므로 검색시간은 O(1), 최악의 경우 단 하나의 모든 값들이 담겨서 O(n)이 될 수도 있지만 일반적으로는 최대한 많은 바구니를 만드는 해시 함수를 사용하기 때문에 거의 O(1)에 가깝다.
[4] 트라이
- '트리' 형태의 자료 구조
- 각 노드가 배열로 이루어져 있다. 맨 위는 루트 노드. 루트 노드를 시작으로 각 화살표가 가리키는 알파벳을 따라가면서 노드를 이어준다.
- 트라이에서 값을 검색하는데 걸리는 시간은 문자열의 길이에 의해 한정되므로 일반적인 영어 이름의 길이를 n이라고 했을때, 검색시간은 O(n)이 되지만, 대부분의 이름은 그리 크지 않기 때문에 O(1)이나 마찬가지라고 볼 수 있다.
[5] 큐
- 값이 아래로 쌓이는 구조
- 선입 선출(FIFO) : 가장 먼저 들어온 값이 가장 먼저 나가는 것 ex. 은행에서 번호표 순대로 일처리
→ 배열이나 연결리스트를 통해 구현이 가능
[6] 스택
- 값이 위로 쌓이는 구조
- 후입 선출(LIFO) : 가장 나중에 들어온 값이 가장 먼저 나가는 것 ex. 뷔페에서 가장 나중에 쌓인거부터 사용
→ 배열이나 연결리스트를 통해 구현이 가능
[7] 딕셔너리
- '키'와 '값'이라는 요소로 이루어짐 ex. '학번'에 따라 '학생'이 결정
- 일반적인 의미에서 '해시테이블'과 동일한 개념
- '키'를 어떻게 정의할 것인지가 중요함
※ 출처 : CS50 - 2019 [네이버부스트코스] https://www.boostcourse.org/cs112/lecture/119038/?isDesc=false
'AI' 카테고리의 다른 글
[CS50-2019] C언어 총정리-(9) 메모리, 문자열 (0) | 2024.05.26 |
---|---|
[CS50-2019] C언어 총 정리(8) 알고리즘 (0) | 2024.05.25 |
- Total
- Today
- Yesterday
- 뉴스
- 기초
- opic
- 30분
- 경제
- 갓생
- Ai
- 고득점 Kit
- 스크랩
- 실기
- 티스토리챌린지
- 루틴
- 빅데이터 분석기사
- 아침
- 습관
- 다이어트
- 오블완
- 아침운동
- 프로그래머스
- C언어
- 미라클모닝
- ChatGPT
- 영어회화
- IH
- 오픽
- llm
- Python
- SQL
- 줄넘기
- 운동
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |