Computer Science(28)
-
자료 구조 | 연결리스트(3) 트리
연결 리스트에서는 각 요소가 다른 요소를 하나씩만 가리키고 있었다. 만약 가리키는 요소가 여러 개가 된다면 어떻게 될까. 학습 목표 트리의 구조를 설명하고 활용하는 코드를 작성할 수 있다. 연결 리스트와 트리 트리는 연결 리스트를 기반으로 한 데이터 구조다. 연결 리스트에서 각 노드들의 연결이 1차원적이었다면, 트리에서는 2차원적으로 구성되어 있다. 각 노드는 일정한 층에 속하고 다음 층의 노드를 가리키는 포인터를 가진다. 트리가 시작되는 노드를 루트라고 한다. 루트는 다음 층의 노드를 가리키며 이를 자식 노드라고 한다. 이진 검색 트리에서 하나의 노드는 두 개의 자식 노드를 가진다. 왼쪽 자식 노드는 자신의 값보다 작고, 오른쪽 자식 노드는 크다. 이러한 트리 구조는 이진 검색을 수행하는데 유리하다. ..
2021.03.01 -
자료 구조 | 연결 리스트(2) 코딩 및 특징
학습 목표 연결 리스트를 구현하고 사용할 수 있다. 연결 리스트와 배열의 장단점을 설명할 수 있다. 연결 리스트 코딩 구조체를 이용하여 실제 연결 리스트를 구현해보자. 지난 포스팅에서 본 그림을 생각하며 코드를 살펴보자. #include #include typedef struct node{ int number; struct node *next; } node; int main(void) { // list라는 이름의 node 포인터 정의 // 아무 것도 가리키고 있지 않기 때문에 NULL로 초기화 node *list = NULL; // 새로운 node를 위해 포인터를 정의하고 메모리 할당 node *n = malloc(sizeof(node)); if(n == NULL){ return 1; } // n의 nu..
2021.02.26 -
자료 구조 | 연결 리스트(1) 도입
이제껏 여러 자료형의 데이터를 메모리 상에 저장하고 삭제하는 방법을 배웠다. 이번 강의부터는 메모리를 좀 더 효율적으로 관리하고 사용하는 법을 배운다. 데이터 구조의 개념과 연결 리스트에 대해 알아보자. 학습 목표 연결 리스트의 정의를 설명할 수 있다. 데이터 구조와 연결 리스트 데이터 구조는 메모리를 좀 더 효율적으로 관리하기 위해 새로 정의하는 구조체다. 연결 리스트(linked list)는 데이터 구조 중 하나이다. 배열에서는 각 인덱스의 값이 메모리 상에 연이어 저장되었다. 하지만 메모리 상의 어디에 있든 주소만 알고 있다면 연이어 값을 읽을 수 있다. 이러한 개념을 사용한 것이 연결 리스트이다. 연결 리스트는 각 인덱스의 메모리 주소에서 자신의 값과 다음 값의 주소(포인터)를 저장한다. 연결 리..
2021.02.26 -
알고리즘 | 재귀
✔ 학습목표 함수를 재귀적으로 사용하는 코드를 작성할 수 있다. 재귀 동일한 작업을 반복할 때는 사용자 정의 함수를 사용하면 보다 효율적으로 코드를 만들 수 있다고 배웠다. 하지만 함수 내에서 동일한 작업이 반복되는 경우에는 어떻게 해야 할까. 본 글에서는 함수를 함수 내에서 재사용하는 방법, 즉 재귀적으로 호출하는 방법을 공부한다. 우리는 이제껏 int main(void){}안에서 프로그램을 작성하고 함수를 호출했다. 그런데 생각해보면 main()도 역시 함수이다. 함수 안에서 또 다른 함수를 사용해온 것이다. 이 사실을 알게 되면 함수가 본인 스스로를 호출해서 사용할 수 있는지에 대한 의문이 생긴다. 답은 할 수 있다 이다. 이를 재귀(Recursion)라고 한다. # ## ### #### #####..
2021.02.08 -
알고리즘 | 병합 정렬
✔ 학습목표 재귀를 활용한 병합 정렬을 구현할 수 있다. 병합 정렬 병합 정렬(merge sort)은 원소가 한 개가 될 때까지 계속해서 나누다가 다시 합쳐가며 정렬을 하는 방식이다. 합병 정렬이라고도 한다. 이는 분할 정복(divide and ) 알고리즘의 하나이다. 분할 정복은 문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음 결과를 모아 원래의 문제를 해결하는 전략이다. 병합 정렬의 단계 병합 정렬은 세 단계로 이루어진다. 1) 분할(Divide): 입력 배열을 같은 크기의 2개의 부분 배열로 분할한다. 2) 정복(Conquer): 부분 배열을 정렬한다. 부분 배열의 크기가 충분히 작지 않으면 순환 호출을 이용하여 다시 분할한다. 3) 결합(Combine): 정렬된 부분 배열들을 하나의 배열로..
2021.02.08