💡 자료구조 21

전화번호부 v4.0 - 더 많은 항목 추가하기, 구조체

이름과 전화번호뿐만이 아니라 더 많은 항목을 추가하는 것이 목표이다. 이를 위해 구조체를 이용하는 방법을 생각해본다. ① 각 사람에 대해서 이름, 전화번호, 이메일 주소, 그리고 그룹(친구, 가족 등)을 지정할 수 있다. (단 이름을 제외한 다른 항목들은 비워 둘 수도 있다.) ② 이름이 하나 이상의 단어로 구성될 수 있으며, 단어 사이에 여러 개의 공백이 있을 경우 한 칸의 공백으로 저장된다. directory.txt 의 파일내용은 다음과 같다. # 가 구분자가 되고 # 사이의 공백은 해당 항목이 없음을 의미한다. David K.#0517778888# #Friend# Hong Gil-Dong# #henry@gmail.com# # John Doe# # # # Sean#01067356574#sean@nav..

💡 자료구조 2021.07.11

전화번호부 v3.0 - 배열 재할당, 라인단위 입력과 문자열 tokenizing

포인터는 변수의 주소를 가리키는 또 다른 변수라 생각하면된다. 그래서 포인터라고도 하지만 포인터 '변수'라고도 불리운다. 주소를 가리킨다는 말은 실제로는 포인터는 대상체의 주소값을 지닌다는 말이다. 이중 포인터란 그럼 포인터도 일종의 변수기 때문에, 포인터를 가리키는 포인터도 존재한다. 이를 이중 포인터라고 한다. 그런데 이런 이중 포인터의 선언 타입은 첫번째 포인터의 선언 타입을 따라간다. 결국 이중포인터도 최초의 변수 즉 최종 대상체가 되는 값의 타입을 기준으로 선언 되는 것이다. int a = 7; int *p1; int **p2; p1 = &a; p2 = &p1; printf("%d ", *p1); printf("%d", **p2); 출력 결과는 7 7 이 나온다. 2021.06.19 - [자료구..

💡 자료구조 2021.06.22

전화번호부 v2.0 - 파일을 저장하고 로드하기, 알파벳 순으로 정렬

2021.06.19 - [자료구조] - 전화번호부 v1.0 전화번호부 v1.0 오늘은 권오흠 교수님께서 전화번호부를 만드는 예제를 가르쳐주셨다. 여태까지 배웠던 C언어의 기초를 응용해서 전화번호부 예제를 만들 수 있었다. void add() { char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE]; ts2ree.tistory.com 이전과 다른 점은 파일을 저장하고 로드하며, 전화번호부는 알파벳 순으로 정렬되어야 한다. 전화번호부 v2.0는 파일을 저장하고 로드하기 위한 load 함수와, save 함수가 추가되었다. 나머지 함수의 변화는 밑에서 살펴볼 것이다. void load() { // command = read char fileName[BUFFER_SIZE]; char buf1..

💡 자료구조 2021.06.19

전화번호부 v1.0

오늘은 권오흠 교수님께서 전화번호부를 만드는 예제를 가르쳐주셨다. 여태까지 배웠던 C언어의 기초를 응용해서 전화번호부 예제를 만들 수 있었다. void add() { char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE]; scanf("%s", buf1); scanf("%s", buf2); names[n] = strdup(buf1); // strdup 와 strcpy 차이는? numbers[n] = strdup(buf2); n++; printf("%s was added successfully.\n", buf1); } buf1 과 buf2 는 지역변수이기 때문에 lifetime 은 짧다. 그러므로 이 함수를 벗어나게 되면 두 변수 모두 소멸하게 된다. 그래서 strdup 를 써주어야 하..

💡 자료구조 2021.06.19

문자열 예제

#include int main() { char buffer[40]; while (1) { printf("$ "); scanf("%s", buffer); printf("%s: %d\n", buffer, strlen(buffer)); } return 0; } 이 코드의 문제점은 scanf("%s", buffer) 부분에서 발생하는데, scanf("%s", ...) 는 공백을 기준으로 다른 단어로 인식한다. 그래서 gets() 라는 함수를 떠올려볼 수 있으나 gets() 함수는 안전하지 않다. 안전하지 않다는 것이 무슨 의미냐하면 buffer 길이를 40으로 제한했음에도 불구하고 40을 넘는 길이의 문자열을 입력했을 때, 그대로 실행이 되면서 40이 넘는 길이를 카운트해주기 때문이다. -> gets() 함수..

💡 자료구조 2021.06.18

시간 복잡도와 빅-오 표기법

"어떤 알고리즘이 어떠한 상황에서 더 빠르고 느리냐?" "어떤 알고리즘이 어떠한 상황에서 메모리를 적게 쓰고 또 많이 쓰냐?" 하나는 '속도'에 관한 것이고, 다른 하나는 '메모리의 사용량'에 관한 것이다. 이것을 수행하는 시간 분석 결과를 가리켜 앞에 것은 '시간 복잡도'라 하고, 뒤에 것은 '공간 복잡도'라 한다. 어떻게 속도를 평가할까? ① 연산의 횟수를 셉니다 ② 그리고 처리해야 할 데이터의 수 n에 대한 연산횟수의 함수 T(n) 을 구성합니다 연산의 횟수가 적어야 빠른 알고리즘이고, ②의 의미는 데이터의 수를 함수에 입력하면 연산의 횟수가 바로 계산이 되는 식을 구성한다는 뜻이다. 그 식은 책에 그림이 있는데 지수나 로그함수 식의 형태 같은 것들이다. 데이터 수의 변화에 따른 연산횟수의 변화 정..

💡 자료구조 2021.06.17

문자열

char str[6]; str[0] = 'h'; str[1] = 'e'; str[2] = 'l'; str[3] = 'l'; str[4] = 'o'; str[5] = '/0' /* C언어는 문자열을 생성하는 편리한 방법을 제공 - 2가지 */ char str[] = "hello"; //혹은 char *str = "hello"; null character('\0')는 문자열의 끝을 표시하는 역할을 한다. 즉, 배열의 크기가 문자열의 길이보다 적어도 1만큼 길어야 한다. 하지만 C언어는 배열의 각 칸마다 문자 하나씩 저장되는 방법말고도 문자열을 생성하는 편리한 방법을 제공해주는데 바로, 겹따옴표(" ")를 사용하는 방법이다. char str[] = "hello"; ------① char *str = "hell..

💡 자료구조 2021.06.16

동적할당 malloc 함수

int *p; p = (int *)malloc(40); if ( p == NULL) { /* 동적 메모리 할당이 실패 */ /* 적절한 조치를 취한다. */ } p[0] = 12; p[1] = 24; *(p+2) = 36; malloc이 반환하는 주소는 원래 타입이 없는 주소(void *)이다. 정수들을 저장하기 위해서 이것을 int *로 변환한다. (반드시 필요한 건 아니다.) 할당 받을 메모리의 크기를 byte단위로 지정한다. 여기서는 10개의 정수를 저장하기 위해서 40바이트를 요청하였다. malloc으로 할당받은 메모리는 이렇게 보통의 배열처럼 사용한다. 첫번째 주소를 리턴해준다. 만약 주소를 잊어버리면 찾기 힘들기 때문에 malloc이 리턴해주는 주소를 보관할 저장소가 필요하다. 그래서 어떤 변..

💡 자료구조 2021.06.16

Binary Search vs Linear Search

정말 노마드 코더님은 비전공자들에게 한줄기 빛과 같다.... 그동안 정보처리기사, Sqld 등등.. 자주 나오는 개념인 이진 탐색(Binary Search)!! 자격증 따면서 글로만 읽었을 때에는 이게 왜 중요한지 이해가 안갔었는데 오늘 영상을 보니 이해가 한방에 되었고 정말 중요한 알고리즘이라는 것을 느꼈다. 오늘도 역시 노마드 코더님의 강의를 보고 블로그 글을 포스팅함으로써 개념을 정리해보려고 한다. 노마드 코더 강의 출처: https://www.youtube.com/watch?v=WjIlVlmmNqs 오늘은 왜 알고리즘이 중요한지 배우기 위해서 같은 작업을 수행하는 알고리즘 2개를 비교해보겠다. 배열 안에 있는 숫자를 어떻게 찾을 수 있을지는 여러 알고리즘이 있는데 어떤 알고리즘을 선택하는지에 따라..

💡 자료구조 2021.06.14

함수의 인자에 대해 알아보기(배열과 포인터)

#include int main(void) { int sum, i, average; int num[10]; for (i = 0; i < 10; i++) scanf("%d", &num[i]); sum = calculate_sum(num); average = sum / 10; printf("%d\n", average); return 0; } int calculate_sum(int array[]) { int sum, i; sum = 0; for (i = 0; i < 10; i++) sum = sum + array[i]; return sum; } main() 안에 있는 sum = calculate_sum(num) 에서 num은 10의 길이를 가지는 배열이다. 배열의 이름은 첫번째 요소의 주소와 같다는 사실은 다..

💡 자료구조 2021.06.10