제 44강) 정렬 알고리즘 - 셀 정렬 오늘은 정렬 알고리즘의 마지막 시간으로 "셀 정렬(Shell sort)"에 대해서 알아봅니다. 셀 정렬은 삽입 알고리즘을 보완한 알고리즘입니다. 셀 정렬이란 (사진 출처 : 위키백과 - 셸 정렬) 셀 정렬은 "Donald Shell(도널드 셀)"이 고안해낸 알고리즘으로 삽입 정렬을 보완한 알고리즘입니다. 먼저 데이터를 여러 분류로 나누어 삽입정렬을 진행합니다. 요런식으로 일정 구간을 정하여 각각의 분류(그룹)를 만들어서 해당 분류 내에서 정렬을 시킵니다. 위에서 3개의 분류로 나뉜 값들을 각각 분류를 기준으로 정렬을 시켰습니다. 이렇게 정렬된 배열을 더 낮은 개수의 분류로 나눕니다. 이제 한 번 더 분류를 기준으로 정렬을 시킵니다. 이 정도까지 하면 대략 가장 큰 ..
제 43강) 정렬 알고리즘 - 힙 정렬3 오늘은 정렬 알고리즘의 여섯 번째 시간으로 "힙 정렬"에 대해서 알아봅니다. 드디어 이전에 배운 것들을 가지고 힙 정렬을 시도합니다. 힙(Heap) 정렬이란 힙은 크게 "Max heap"과 "Min heap"으로 나뉩니다. "Max heap"(왼쪽)의 경우에는 가장 큰 요소가 맨 위에 올라와 있고, "Min heap"(오른쪽)의 경우에는 가장 작은 요소가 맨 위에 올라와 있습니다. 이렇게 1차적으로 정렬된 힙에서 맨 위의 요소(부모)를 하나씩 제거합니다. 그리고 맨 마지막 요소를 맨 위로 올립니다. 제거한 요소는 새로운 배열에 하나씩 차곡차곡 쌓습니다. 이렇게 바뀐 힙을 다시 재정렬 합니다. 이렇게 재정렬 되어진 힙에서 다시 맨위의 요소를 제거하여 이 과정을 계속..
제 42강) 정렬 알고리즘 - 힙 정렬2 오늘은 정렬 알고리즘의 세번째 시간으로 "삽입 정렬"에 대해서 알아봅니다. 기본적으로 삽입 정렬은 배열에서 사용합니다. 오늘은 힙(Heap)에 대해서 알아볼겁니다. 힙(Heap) 이란 힙은 지난 시간에 배운 "이진트리(binary tree)" 중에서도 "완전 이진트리(complete binary tree)"를 기반으로 한 자료구조입니다. 자료 구조 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 자료구조(資料構造, 영어: data structure)는 컴퓨터 과학에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장을 의미한다.[1][2][3] 더 정확히 말해, �� ko.wikipedia.org 힙은 다음과 같은 조건을 만족합..
제 36강) 정렬 알고리즘 - 버블 정렬 오늘은 정렬 알고리즘의 첫 시간으로 "버블 정렬"에 대해서 알아봅니다. 기본적으로 버블 정렬은 배열에서 사용합니다. 버블 정렬이란 (사진 출처: 위키 백과 - 거품 정렬) 버블 정렬은 구현하기가 가장 쉽지만 성능을 기대하기 어려운 정렬입니다. (실질적으로 안쓰는 정렬 중 하나) 버블 정렬은 해당 인덱스와 그 다음 인덱스와의 크기를 비교하여 바꾸는 정렬로 결과적으로 한 사이클이 지날때 마다 가장 큰 인덱스의 값은 맨 뒤로 옮겨집니다. 위의 그림에서 첫 번째 사이클에서 이미 가장 큰 수인 11이 맨 뒤로 옮겨집니다. 그렇기 때문에 두 번째 사이클에서는 11을 제외한 4개의 숫자를 가지고 다시 정렬을 합니다. 그렇기 때문에 버블 정렬의 비교 횟수는 T(n) = n(n ..
제 37강) 정렬 알고리즘 - 선택 정렬 오늘은 정렬 알고리즘의 두번째 시간으로 "선택 정렬"에 대해서 알아봅니다. 기본적으로 선택 정렬은 배열에서 사용합니다. 선택 정렬이란 (사진 출처 : 위키백과 - 선택 정렬) 선택 정렬 또한 버블 정렬과 마찬가지로 성능을 기대하기 어려운 정렬 중 하나입니다. 또한 구현하기도 어렵지 않은 정렬입니다. 매 사이클마다 배열에서 가장 큰 수를 찾습니다. 그렇게 찾은 큰 수를 맨 뒤에서 사이클의 반복횟수만큼 뺀 위치의 원소와 자리를 바꿉니다. (그 이유는 첫 사이클을 제외한 사이클에서는 맨 뒤에있는 수는 이미 정렬이 끝난 가장 큰 수이기 때문입니다.) 사실 위의 과정은 상당히 간략화 되었지만 자세히 들여다 보겠습니다. 선택 정렬은 각 사이클마다 위의 과정처럼 최대 수를 찾..
제 35강) 라이브러리 함수3 - 날짜 및 시간 오늘은 "강의에서 다루지 않았던"의 다섯번째 시간입니다. 이번 시간에는 라이브러리 함수3인 날짜 및 시간 라이브러리에 대해서 다뤄보려고 합니다. C언어에서 제공하는 "날짜 및 시간" 라이브러리는 time.h를 포함하면 사용이 가능합니다. 자료형 time.h 에는 다음과 같이 4개의 자료형을 선언하고 있습니다. 이름 자료형 원형 기능 clock_t Tick 수를 샐 수 있는 시계 전용 자료형(시스템 시간을 잴 때 사용) size_t unsigned int 부호 없는 정수 자료형으로 바이트 단위의 크기를 나타낼 때 사용 time_t 시간을 나타내기 위한 자료형 struct tm 시간을 받아서 저장하는 구조체 여기서struct tm을 좀더 자세히 봅시다. 멤버..
제 34강) 라이브러리 함수2 오늘은 "강의에서 다루지 않았던"의 네번째 시간입니다. 이번 시간에는 라이브러리 함수2에 대해서 다뤄보려고 합니다. 문자 함수(ctype.h) 문자 하나를 다루는 함수입니다. 여기서 정의되는 모든 함수는 참일 경우에는 0이 아닌 int 값을 반환하고, 거짓일 경우에는 0을 반환하는 성질을 가졌습니다. 먼저 isalnum과 isalpha를 보겠습니다. #include // 여기서 설명하는 모든 함수는 ctype.h에 정의되어 있습니다. int isalnum (int c); c가 영문자(대 + 소) 또는 숫자인지 판단 => if (isalnum(65)) // 이때 65는 대문자 A를 나타내기 때문에 참 int isalpha (int c); c가 영문자(대 + 소)인지 판단 =>..
제 33강) 라이브러리 함수1 오늘은 "강의에서 다루지 않았던"의 세번째 시간입니다. 이번 시간에는 라이브러리 함수에 대해서 다뤄보려고 합니다. 변환 함수(stdlib.h) 데이터를 원하는 자료형으로 변환하여 주는 함수입니다. 문자(char)를 숫자로 바꾼다던지, 반대로 숫자를 문자로 바꾼다던지 하는 변환을 수행합니다. 먼저 atoi, atof, atol, itoa(비표준함수) 입니다. #include // 아래의 모든 함수는 stdlib.h에 선언되어 있습니다. // 문자열 str을 int형 정수로 변환 // (올바른 정수로 변환을 못할 시에는 0을 반환) // (이때 문자열은 10진수로만 표현해야하며, 소수가 들어올 시 소수점 무시 및 e,E 무시) int atoi (const char* str); ..
제 32강) Call by ~ 오늘은 "강의에서 다루지 않았던"의 두번째 시간입니다. 이번 시간에는 어떻게 보면 민감(?)하고 잘못된 설명들이 난무(?)하기도 하는 것을 다뤄보려고 합니다. 바로 Call By ~ 에 대해서 알아봅시다. 1) Call by value 값을 직접 호출하는 방식을 "Call by value", 한국어로 "값에 의한 호출"이라고 합니다. /* Call by value */ #include void printNum(int _num) { printf("num: %d\n", _num); } int main(void) { int num = 15; printNum(num); // Call by value return 0; } 위와 같이 직접 값(주소값이 아닌!!)을 전달하여 호출하는 것..
제 31강) 포인터를 이용한 함수 통신 오늘은 "강의에서 다루지 않았던"의 첫번째 시간입니다. 포인터를 이용하여 함수간의 통신을 하는 법에 대해서 알아봅시다. 번지 연산자& 포인터를 이용하여 함수간 통신(Communication)을 하기 위해서는 "번지 연산자"를 사용합니다. 이 통신을 함으로써 다른 함수에서 값을 입력받아올 수 있고 이미 있는 변수의 값을 서로 바꾸어줄 수도 있습니다. 대표적인 포인터를 이용한 함수 통신으로는 스왑(Swap)이 있습니다. #include void swap(int* _num1, int* _num2) { int tmp = *_num1; *_num1 = *_num2; *_num2 = tmp; printf("Swap!!\n"); } int main() { int num1 = 5..