CS50 37

[CS50] 스택, 큐, 딕셔너리

오늘은 이전까지 공부했던 내용 중에 다뤘던 자료이기도 하지만 많이 쓰이는 데이터 구조 3가지를 더 자세히 알아볼 텐데요 메모리 구조인 큐, 스택부터 해시 테이블로 구현할 수 있는 딕셔너리에 대해 공부해보도록 하겠습니다. 큐(Queue) 큐는 메모리 구조에서 잠깐 언급했지만 값이 아래로 쌓이는 구조를 가지고 있습니다. 값을 뺄 때는 FIFO(First In First Out), 즉 선입선출방식으로 가장 먼저 들어온 값이 가장 먼저 나가게 됩니다. Queue의 사전적 정의를 보면 (무엇을 기다리는 사람, 자동차 등의) 줄, 혹은 줄을 서서 기다리는 것이라고 나와있습니다. 만약 은행에서 줄을 설 때 먼저 줄을 선 사람이 먼저 업무를 처리하는 것과 같다고 보시면 됩니다. 큐는 배열이나 연결리스트를 통해 구현이 ..

[CS50] 트라이

지금까지 연결 리스트부터 해시 테이블까지 공부해봤는데 혹시 문자열이 일정한 경우라면 어떤 게 가장 최적일까요? 또 이 문자열들을 저장하고 관리하는 건 어떨까요? 오늘은 트라이라는 자료구조에 대해 공부해보도록 하겠습니다. 트라이라는 자료구조는 기본적으로는 트리형태를 가지고 있지만, 이때 특이한점은 각 노드가 배열로 이루어져 있다는 것입니다. 만약 알파벳 a ~ z 까지로 이루어진 문자열 값을 저장하려고 한다면 이 노드는 a부터 z까지의 값을 가지는 배열이 되고 각 배열의 요소는 다음 층의 노드(a ~ z 배열)를 가리키게 됩니다. 이게 무슨 말이냐 하면 예를들어 Harry, Hagrid, Hermione 이 세 문자열을 트라이에 저장해보겠습니다. 그럼 다음과 같이 표시할 수 있습니다. 작아서 잘 안보이겠지..

[CS50] 연결리스트 : 트리

지난 포스팅에서 연결 리스트를 활용해 다양한 데이터 구조를 만들어봤습니다. 연결 리스트는 각 요소가 다른 요소를 하나씩만 가리키고 있었는데 만약 가리키는 요소가 더 많아진다면 어떻게 될까요? 오늘은 연결 리스트 기반의 자료구조인 '트리'에 대해 공부해보도록 하겠습니다. 트리는 기존 연결리스트의 각 노드들의 연결과 달리 2차원적으로 구성되어있는 연결입니다. 각 노드는 일정한 층에 속하게 되고, 다음 층의 노드들을 가리키는 포인터를 갖게 됩니다. 쉽게 그림으로 표현하자면 이렇게 기존 연결 리스트의 각 노드들이 1차원적으로 연결되어 있었다면 트리는 이렇게 표현합니다. 여기서 가장 높은 층에서 트리가 시작되는 노드를 '루트'라고 합니다. 루트 노드는 다음 층의 노드들을 각각 가리키고 있고 이를 '자식 노드'라고..

[CS50] 연결리스트 : 시연

이번 포스팅에선 저번 포스팅의 내용을 실제 강의에서 어떤 방식으로 학생들이 시연하는지를 보고 이해하는 것이 편할 것 같아 링크를 남깁니다. https://www.boostcourse.org/cs112/lecture/119040?isDesc=false 모두를 위한 컴퓨터 과학 (CS50 2019) 부스트코스 무료 강의 www.boostcourse.org 이 영상을 보고 지난 시간에 코딩했던 코드를 보면 이해가 빠를겁니다. #include #include //지난 시간에 포스팅한 node 구조체 정의 typedef struct node { int number; struct node *next; } node; int main(void) { //list라는 이름의 node 포인터를 정의함과 동시에 NULL로 초..

[CS50] 연결리스트 : 코딩

지난 포스팅에서 연결 리스트의 정의와 리스트의 기본 단위가 되는 구조체를 정의하는 방법에 대해 공부했습니다. 오늘은 이 구조체를 이용해 실제로 연결 리스트를 구현하고 사용해보도록 하겠습니다. 실제로 그림과 같이 리스트에 숫자 2가 저장되어있다고 할때 그림과 같이 숫자 4를 추가하려면 어떻게 해야 할까요? 코드로 작성해보면 node *n = malloc(sizeof(node)); if (n != NULL) { n->number = 4; n->next = NULL; } 이런 식으로 작성해서 4를 넣기 위한 새로운 node를 할당받아야 합니다. 하지만 이렇게 node를 만들기만 한다고 끝나는 것이 아니라 화살표도 연결해줘야 list와 연결된 숫자임을 알 수 있습니다. 어떻게 화살표를 추가해야 할까요? 여기서 ..

[CS50] 연결리스트 : 도입

지금까지 여러 자료형의 데이터를 메모리에 저장하고, 읽고, 삭제하는 방법에 대해 공부했었습니다. 그런데 만약 프로그램이 복잡해지거나 양이 방대해진다면 기본적인 포인터 구조만으로는 메모리를 관리하기에 다소 번거로울 겁니다. 그래서 오늘은 메모리를 더 효율적으로 관리하고 사용하기 위한 데이터의 개념과 연결 리스트에 대해 공부해보도록 하겠습니다. 데이터 구조란 우리가 컴퓨터 메모리를 효율적으로 관리하기 위해 새로 정의하는 구조체입니다. 이 데이터 구조중 하나인 연결 리스트는 배열과 다르게 각 값이 메모리에 여러군데 나누어져 있더라도 다음 값의 메모리 주소만 기억한다면 배열처럼 값을 연이어서 읽어 들일 수 있게 해 주는 것을 말합니다. 이렇게 각각의 번호가 떨어져 있더라도 포인터를 이용해서 자신의 값과함께 바로..

[CS50] 배열의 크기 조정하기

컴퓨터의 메모리는 사물함 같은 구조를 가지고 있습니다. 예를 들어 학교에 30개의 사물함이 있다고 하면 전학생이 왔다고 해서 사물함의 개수를 더 늘리거나 30개보다 더 많이 사용할 수는 없습니다. 이 같이 이미 일정한 크기의 메모리가 할당되어 있는 상황에서 그 크기를 늘리기는 쉽지 않습니다. 오늘은 포인터와 malloc의 개념을 응용하여 이미 정의된 배열의 크기를 바꾸는 방법에 대해 공부해보도록 하겠습니다. 배열의 크기를 늘리기 가장 쉬운방법은 이미 배열이 저장된 메모리의 옆에 일정 크기의 메모리를 덧붙이면 되지만 실제로는 다른 데이터가 있을 수 있기 때문에 어렵습니다. 따라서 새로운 공간에 큰 배열을 저장할 수 있는 메모리를 다시 할당하고 기존 배열의 값을 하나씩 옮겨줘야합니다. 이러한 작업은 기존 배..

[CS50] malloc과 포인터 복습

오늘부터는 메모리의 다음 강좌인 자료구조에 대해 공부해보겠습니다. 평소에 공부하던 자바가 아닌 C라 조금 낯설긴 한데 그래도 다양한 데이터 구조를 공부해보는 건 좋은 거 같아요 오늘은 그중에서도 데이터 구조를 정리하는데 중요한 포인터와 메모리에 대한 개념을 한번 더 복습해보겠습니다. 아래와 같이 main 함수를 작성해보겠습니다. int main(void) { int *x; int *y; x = malloc(sizeof(int)); *x = 42; *y = 13; } 이 코드는 문제없이 정상적으로 작동할까요?? 아니라면 어느 부분이 문제가 될까요?? 첫줄에 포인터를 이용해 x, y를 각각 선언해주었습니다. 그다음으로 x에는 malloc 함수를 이용해 int형의 사이즈에 해당하는 메모리를 할당합니다. 그리고..

[CS50] 파일 읽기

어느덧 벌써 메모리 파트의 마지막인 파일 읽기입니다. 우리가 일상적으로 사용하는 파일은 텍스트, 이미지, 비디오 등 여러 가지 형식이 존재합니다. 각 파일에는 파일 형식을 알려주는 실마리들이 존재한다고 합니다. 만약 파일 형식이 JPEG의 경우 JPEG 파일 형식인지를 알려주는 실마리가 파일 값 속에 있습니다. 이번 포스팅에서는 그 실마리를 찾아보도록 하겠습니다. 우선 다음과 같이 파일을 읽어서 JPEG이미지인지 검사하는 프로그램을 만들어보겠습니다. #include int main(int argc, char *argv[]) { if (argc != 2) { return 1; } FILE *file = fopen(argv[1], "r"); if (file == NULL) { return 1; } unsig..

CS 기초/메모리 2021.08.26

[CS50] 파일 쓰기

지금까지는 get_string, get_int등 사용자에게 입력받는 함수를 cs50 라이브러리를 이용해서 사용했습니다. 그렇다면 라이브러리엔 이 함수가 어떻게 구현되어있을까요? 오늘은 이전 포스팅에서 배웠던 메모리 교환, 스택의 정의를 잘 생각해보고 이 함수를 구현해보고 파일에 출력하는 방법에 대해 공부해보도록 하겠습니다. 지난 포스팅에서 machine code, globals등 메모리 구조에 대해 간단하게 정리했었는데요 이런 그림으로 설명했었습니다. 그 중 heap영역에서는 malloc에 의해 메모리가 더 할당될수록 점점 사용하는 메모리의 범위가 더 아래로 늘어납니다. 마찬가지로 stack 영역에서는 함수가 많이 호출될수록 메모리의 범위가 더 위로 늘어나겠죠 이렇게 서로 점점 늘어나다 보면 제한된 메모..

CS 기초/메모리 2021.08.25