본문 바로가기

c언어25

C언어 ] qsort (Quick Sort, 퀵정렬) 함수 사용법 C언어 표준 라이브러리에 포함된 qsort 함수는 퀵 정렬(Quick Sort) 알고리즘을 사용하여 배열을 정렬하는 데에 사용된다. 아래는 qsort 함수의 사용법에 대한 예시이다. 1. 헤더 파일 include qsort 함수를 사용하려면 stdlib.h 헤더 파일을 포함해야 한다. #include 2. 비교 함수 작성 qsort 함수를 사용하기 위해선 정렬을 위해 사용할 비교 함수를 만들어야 하며, 이 함수는 두 요소를 받아들여 비교한 결과를 반환해야 한다. 반환값이 음수, 0, 양수인지에 따라 정렬의 순서가 결정된다. 비교 함수의 반환값이 양수면, qsort 함수는 두 요소의 순서를 바꾼다. int compare(const void *a, const void *b) { // 비교 로직 작성 retu.. 2024. 1. 30.
C언어 ] leetCode 3016 - Minimum Number of Pushes to Type Word II leetCode 3016 문제 You are given a string word containing lowercase English letters. Telephone keypads have keys mapped with distinct collections of lowercase English letters, which can be used to form words by pushing them. For example, the key 2 is mapped with ["a","b","c"], we need to push the key one time to type "a", two times to type "b", and three times to type "c" . It is allowed to remap .. 2024. 1. 28.
C ] 비트필드와 공용체 사용 #include #include typedef struct { uint32_t bit1 : 1; uint32_t bit2 : 2; uint32_t bit3 : 3; } MyBits; union MyUnion { uint32_t all; MyBits bits; }; int main() { union MyUnion myUnion; myUnion.all = 0; myUnion.bits.bit1 = 1; myUnion.bits.bit2 = 2; myUnion.bits.bit3 = 5; printf("all: %u\n", myUnion.all); printf("bit1: %u\n", myUnion.bits.bit1); printf("bit2: %u\n", myUnion.bits.bit2); printf("bit3.. 2023. 5. 29.
C언어 ] leetCode 2181 - Merge Nodes in Between Zeros You are given the head of a linked list, which contains a series of integers separated by 0's. The beginning and end of the linked list will have Node.val == 0. For every two consecutive 0's, merge all the nodes lying in between them into a single node whose value is the sum of all the merged nodes. The modified list should not contain any 0's. Return the head of the modified linked list. Exampl.. 2023. 5. 7.
C언어 ] 맵 자료구조 구현 map 생성시 사이즈를 직접 결정할 수 있도록 해보았다. 근데 링버퍼처럼 범용적으로 쓸 거 같진 않아서 사실 고정길이배열로 mapManger 구조체안에 둬도 될 것 같다. map.h #include "main.h" #define MAP_MAX_KEY_LEN20 // 맵 자료구조 typedef struct { char key[MAP_MAX_KEY_LEN+1]; uint32_t value; } map_t; // 맵 자료구조 관리 구조체 typedef struct { map_t* maps; uint32_t currentSize; uint32_t maxSize; } mapManager_t; void map_create(mapManager_t* mapManager, map_t* maps, uint32_t maxS.. 2023. 5. 7.
C ] float to hex / hex to float Converter 2023.04.09 - [프로그래밍/C# (WinForms)] - C#, WinForms ] float to hex / hex to float Converter C#, WinForms ] float to hex / hex to float Converter 필요에 의해서 만들었다. 내가 예전에 소개한 float to hex converter 사이트랑 달리 시스템 아키텍쳐에 따라 메모리에 저장된 대로 보여준다. 디자이너 부분을 먼저 살펴보면 Form은 사용자가 크기를 eteo.tistory.com 위 글에서 WinForms로 만든 float to hex / hex to float Converter를 C언어로 간단히 구현해 본 것. 예외처리나 옵션 없이 리틀엔디안으로 변환하는 기능만 넣었다. #include .. 2023. 4. 9.
C ] 시간복잡도가 O(1)인 2의 거듭제곱 판별 int isPowerOfTwo(int n) { return (n && ((n & (n - 1)) == 0)); } 2의 거듭제곱은 가장 왼쪽에 있는 1을 제외하고 뒷부분이 전부 0이라는 걸 고려할 때 위와 같은 코드로 판별할 수 있다. 그리고 어떤 정수를 2의 거듭제곱 수로 나눈 나머지 연산을 해야할 때 성능향상을 위한 최적화 기법으로 %연산이 아니라 &연산을 쓰기도 한다. 위와 같은 논리이다. #define SOME_NUMBER_POWER_OF_TWO8 int getRemainder(int n) { return n & (SOME_NUMBER_POWER_OF_TWO - 1); } 2023. 3. 31.
C언어 ] 프로그래머스 Lv.2 - 피보나치 수 문제 설명 피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다. 예를들어 F(2) = F(0) + F(1) = 0 + 1 = 1 F(3) = F(1) + F(2) = 1 + 1 = 2 F(4) = F(2) + F(3) = 1 + 2 = 3 F(5) = F(3) + F(4) = 2 + 3 = 5 와 같이 이어집니다. 2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요. 제한 사항 n은 2 이상 100,000 이하인 자연수입니다. 입출력예 n return 3 2 5 5 입출력 예 설명 피보나치수는 0번째부터 0, 1, 1, 2, 3, 5.. 2023. 3. 31.
C언어 ] 프로그래머스 Lv. 2 - N개의 최소공배수 문제 설명 두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요. 제한 사항 arr은 길이 1이상, 15이하인 배열입니다. arr의 원소는 100 이하인 자연수입니다. 입출력 예 arr result [2,6,8,14] 168 [1,2,3] 6 #include #include #include static int gcd(int a, int b) { while .. 2023. 3. 31.
C언어 ] 프로그래머스 Lv. 2 - 최솟값 만들기 문제 설명 길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다. 배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.) 예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면 A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5) A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21.. 2023. 3. 25.
C언어 ] leetCode 1689 - Partitioning Into Minimum Number Of Deci-Binary Numbers A decimal number is called deci-binary if each of its digits is either 0 or 1 without any leading zeros. For example, 101 and 1100 are deci-binary, while 112 and 3001 are not. Given a string n that represents a positive decimal integer, return the minimum number of positive deci-binary numbers needed so that they sum up to n. Example 1: Input: n = "32" Output: 3 Explanation: 10 + 11 + 11 = 32 Ex.. 2023. 3. 25.
C ] memset 함수 구현 void *my_memset(void *s, int c, int len) { unsigned char *p = (unsigned char *)s; while (len > 0) { *p = c; p++; len--; } return (s); } #include void *my_memset(void *s, int c, int len) { unsigned char *p = (unsigned char *)s; while (len > 0) { *p = c; p++; len--; } return (s); } int main() { char str[13] = "hello world!"; for (int i = 0; str[i] != '\0'; i++) { printf("%c", str[i]); } printf("\n.. 2022. 10. 9.
C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기 printf() 함수의 경우 내가 원하는 만큼 인자를 넘길 수있다. 예를 들면 printf("%d", a);// 인자 2개 printf("%d %d", a, b);// 인자 3개 이게 가능한 이유는 printf()가 매개변수의 개수가 정해지지 않은 가변인자 함수이기 때문이다. 가변인자 함수로 인자의 개수와 상관없이 정수형 인자를 여러개 받아서 인자 모두를 더한 값을 반환하는 함수를 만들어보도록 하겠다. #include // stdarg.h 포함. va_list, va_start, va_arg, va_end가 정의된 헤더 파일 #include int sum(int num_args, ...) { // 가변 인자의 개수를 받음, ...로 가변 인자 설정 va_list ap;// 가변 인자 목록 포인터 va_s.. 2022. 8. 12.
C언어 ] 프로그래머스 Lv. 1 - 핸드폰 번호 가리기 문제 설명 프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요. 제한 조건 phone_number는 길이 4 이상, 20이하인 문자열입니다. 입출력 예 phone_number return "01033334444" "*******4444" "027778888" "*****8888" 나의 풀이 #include #include #include #include // 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요. char* solution(cons.. 2022. 5. 17.
C언어 ] 프로그래머스 Lv. 1 - 자연수 뒤집어 배열로 만들기 문제 설명 자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 입출력 예 n return 12345 [5,4,3,2,1] 나의 풀이 #include #include #include int* solution(long long n) { // 리턴할 값은 메모리를 동적 할당해주세요. long long copyn=n; int count=0; while(copyn>0){ copyn=copyn/10; count++; } int div=10; int* answer = (int*)malloc(sizeof(int)*count); for(int i=0;i 0) { answ.. 2022. 5. 17.
C언어 ] 프로그래머스 Lv. 1 - 내적 문제 설명 길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요. 이때, a와 b의 내적은 a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1] 입니다. (n은 a, b의 길이) 제한사항 a, b의 길이는 1 이상 1,000 이하입니다. a, b의 모든 수는 -1,000 이상 1,000 이하입니다. 입출력 예 a b result [1,2,3,4] [-3,-1,0,2] 3 [-1,0,1] [1,0,-1] -2 #include #include #include // a_len은 배열 a의 길이입니다. // b_len은 배열 b의 길이입니다. int solution(int a[], size_t a_l.. 2022. 5. 17.
C언어 ] 프로그래머스 Lv. 1 - 나머지가 1이 되는 수 찾기 문제 설명 자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증명될 수 있습니다. 제한사항 3 ≤ n ≤ 1,000,000 입출력 예 n result 10 3 12 11 #include #include #include int solution(int n) { for(int i=1;i 2022. 5. 17.
C언어 ] 프로그래머스 Lv. 1 - 없는 숫자 더하기 문제 설명 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 1 ≤ numbers의 길이 ≤ 9 0 ≤ numbers의 모든 원소 ≤ 9 numbers의 모든 원소는 서로 다릅니다. 입출력 예 numbers result [1,2,3,4,6,7,8,0] 14 [5,8,4,0,6,7,9] 6 #include #include #include // numbers_len은 배열 numbers의 길이입니다. int solution(int numbers[], size_t numbers_len) { int answer = 45; for(.. 2022. 5. 17.
[ C언어 ] 프로젝트 : 이중 연결 리스트로 구현한 도서 관리 프로그램 - (5) - 링크드 리스트와 파일 입출력 , 노드 추가 도서 관리 프로그램 개선 5탄이자 마지막. 자료구조를 기존의 배열에서 이중 연결 리스트(Doubly Linked List)로 바꾸었다. 2022.04.25 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (4) - 파일 입출력 - fopen/fopen_s, .bin 바이너리 파일 읽기/쓰기 이건 개선이라기보다 거의 새로 짜는거에 가까웠다..프로젝트 처음 시작할때 자료구조를 먼저 결정하고 ADT를 정의하는 것의 중요성을 체감한다. 참고로 이중 연결 리스트는 헤드/테일 더미노드가 있고 꼬리쪽에 삽입하는 버전이다. 사실 처음에는 진짜 제일 간단한 단순 연결 리스트(Single Linked List)로 구현하려고 했었는데 여기까지 온 이유가 있다. 내가 프로그램을 만들면서.. 2022. 5. 2.
[ C언어 ] realloc은 얼마나 자주 메모리 주소를 옮길까? realloc함수에 대한 설명을 찾아보면 다음과 같은 과정으로 작동한다고 한다. 1. 동적할당된 메모리 크기를 변경해 재할당함 (기존 주소일수도 있고, 새로운 주소일 수도 있음) 2. (새로운 주소에 할당한 경우) 기존 주소에 있던 값을 새로운 주소에 복사하고 원래 주소는 할당해제함 얼마나 많이 메모리 주소를 옮겨갈까 궁금해서 아래 코드로 테스트를 해보았다. #define _CRTDBG_MAP_ALLOC #include #include #include #include int main(void) { int arraysize = 10; int i = 0; char* test = (char*)malloc(sizeof(char) * arraysize); int plus = 10; float chk = 0; fo.. 2022. 5. 2.
[ C언어 ] scanf 공백 ( 띄어쓰기 ) 포함 원하는 길이 만큼만 문자열 입력 받는 방법. 공백을 포함해서 입력받는 동시에, 배열의 길이를 넘는 입력이 들어오더라도 오류가 나지 않고 지정된 길이 만큼만 변수에 저장되는 받는 방법을 소개한다. 첫번째 방법 1. "%숫자[^\n]" #include int main(void) { char str[20]; printf("도서 이름을 입력하세요 :"); scanf_s("%20[^\n]", str, sizeof(str)); //fgets(str, 19, stdin); printf("입력하신 도서이름은 %s 입니다.\n", str); return 0; } 예를들어 char 배열의 크기가 20인 경우, null문자가 들어갈 공간을 생각해서 그보다 작은 숫자를 지정해주면 아무리 입력이 많이들어와도 딱 그 길이 만큼만 배열에 저장된다. 한글의 경우 2바이트를 차.. 2022. 4. 27.
[ C언어 ] enum 의 활용 + 사용예제 열거형 enum은 관련이 있는 정수형 상수의 집합으로 typedef로 별칭을 정의하면 더욱 편리하게 사용 가능하다. 간단한 예제 #include typedef enum { FALSE, TRUE }boolean; typedef enum { MALE =1, FEMALE }gender; int main(void) { boolean exit=FALSE; char answer; while (exit == FALSE) { printf("성별을 입력하세요(1.남자, 2.여자):"); scanf_s("%hhd", &answer); rewind(stdin); if (answer == FEMALE) { printf("여자입니다.\n"); } else if (answer == MALE) { printf("남자입니다.\n").. 2022. 4. 26.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 지난편에 이어 도서 삭제기능을 동적할당을 사용한 버전으로 바꿔보자. 2022.04.12 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 처음으로 돌아가서 삭제기능은 먼저 검색을 수행하고 검색결과를 출력해서 보여준 뒤 삭제할지 말지 선택을 입력받고 삭제하게 해야했다. 그럼 삭제함수 안에서 검색함수를 호출해야하고 그 검색결과가 담긴 데이터가 필요한데 여기서 문제가 있다. 일반적으로 검색함수 내에서 변수(배열)를 선언하면 그 지역변수는 함수를 빠져나오면서 소멸된다. 하지만 내가 필요한 검색결과가 담긴 변수의 수명은 검색함수의 시작과 끝을 함께하면 안된다. 삭제함수가 필요할 때 생성되고 삭제후 필요없어지면 사라져도 되는데 이런상황을 위해 동적할당이 .. 2022. 4. 22.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 book.h #ifndef __BOOK_H__ #define __BOOK_H__ #define SIZE 20 typedef struct { char year; char month; char day; }_stDate; typedef struct { char title[30]; int price; char author[10]; int page; _stDate date; } _stBook; char DispMenu(char num); char CountData(_stBook list[]); char AddBook(_stBook list[], char num); void PrintBook(_stBook list[], char num); char RmBook(_stBook list[], char num); voi.. 2022. 4. 12.
[ C언어 ] 중복없이 난수생성 / 랜덤값 뽑기 / 로또번호 생성 / 선택정렬 (rand, srand, time 함수) 1. stdlib.h, time.h 헤더파일 포함하기 #include #include 2. 메인함수 안쪽 상단에 srand((unsigned)time(NULL)); 를 한번만 사용 srand((unsigned)time(NULL)); 진정한 의미의 난수생성을 위해 time을 seed값으로 넣어주는 부분, 간혹 컴파일 에러가 뜨는 경우가 있어 unsigned로 캐스팅해준다고 한다. 3. rand() 함수와 % 나머지연산자를 활용하여 랜덤값 생성 예를들어, 0~9 사이의 난수생성을 원한다면 rand()%10 1~10 사이의 난수생성을 원한다면 (rand()%10)+1 4. 중복없이 난수 뽑기 만약 뽑아야할 난수의 갯수가 많지 않다면 이런 방법도 있다. for (;;) { a = rand() % 10; b = .. 2022. 4. 4.