본문 바로가기

C

(16)
배열 a에서의 a와 &a를 포인터에 저장할 때의 차이점 int a[4] = {1, 2, 3, 4}가 있다고 하겠습니다. 1. 배열의 이름인 a는 배열의 첫번째 원소의 주소로 해석됩니다. 그래서 p를 배열의 이름인 a를 포인터로 사용하기위해서는 첫번째의 원소의 타입이 int이므로 int형 포인터로 코드를 작성해야합니다. int a[4] = {1, 2, 3, 4}; int *p = a; 2. &a는 배열의 전체 타입의 주소로 해석됩니다. -> &a는 배열의 전체 크기가 타입의 주소로 해석됩니다. &a는 (int[4])가 하나의 타입으로 되는 포인터로 해석합니다. 그래서 이곳에서는 타입이 int[4]이기 때문에 int a[4] = {1,2,3,4}; int (*p)[4] = &a; 로 작성해주어야한다.
2진수를 C언어에서 출력하는 여러가지 방법들 [C] 시작하기 앞서 Int형이 32bit라고 할것이다. (uint32_t)사용 1. QUEUE 배열 + For문을 이용하기 시간이 많이 걸릴 수 있다. 연산횟수가 많아질 수 있다. #include #include uint32_t i; //i는 0 uint32_t array[32]; //0~31 index를 0으로 초기화 int main() { uint32_t data; scanf("%d", &data); while(data) { array[i++] = data%2; data /= 2; } for(i; i>=0; i--) { printf("%d", array[i]); } return 0; } 2. 재귀함수를 이용한다. (STACK) QUEUE 배열+ For문을 이용하는것보다 효율적일 수 있다. #include ..
순차탐색과 이진탐색 [C] 순차탐색과 이진탐색 순차탐색을 살펴보자 #include int n; int tamsaek(int *arr, int f) { for(int i=0; i
분할정복법에서의 정렬, 퀵정렬과 합병정렬 [C] 분할정복법이란 여러알고리즘의 기본이 되는 해결방법이다 엄청나게 크고 방대한 문제를 조금씩 나눠가면서 용이하게 풀 수 있는 문제 단위로 나눈 다음 그것들을 다시 합쳐서 해결하자는 개념이다. 분할정복법에서의 정렬방법에는 대표적으로 퀵정렬과 합병정렬이 있다. ##퀵정렬을 알아보자 퀵정렬은 매우 빠른 수행 속도를 자랑하는 정렬방법이다. 전체리스트를 2개의 부분리스트로 분할하고, 각가의 부분리스를 다시 퀵정렬하는 전형적인 분할 정복법을 사용한다. 퀵정렬코드이다 #include #define swap(x,y,t) ((t)=(x), (x)=(y), (y)=(t)) int n, cnt; void print(int list[]) { printf("%d?④퀎 : ", ++cnt); int i; for(i=0; i pivo..
링크드리스트로 이진트리를 구현하기 [C] #include #include #include typedef struct treeNode{ char data; struct treeNode *left; struct treeNode *right; } treeNode; treeNode* makeRootNode(char data, treeNode* leftNode, treeNode* rightNode) { treeNode *root =(treeNode *)malloc(sizeof(treeNode)); root ->data = data; root->left = leftNode; root->right = rightNode; return root; } preorder(treeNode* root) { if(root) { printf("%c", root->data)..
이진트리를 만들어 탐색해보자! [C] 이진트리는 무엇인가? 이진트리의 특성 이진트리 탐색법 #include #include typedef char element; typedef struct treeNode { char key; struct treeNode* left; struct treeNode* right; } treeNode; treeNode* searchBST(treeNode* root, char x) { treeNode *p; p = root; while(p != NULL) { if(p->key left; } else if(p->key == x) return p; else { p= p->right; } } printf("찾으시는키가없습니다"); return p; } treeNode* insertNode(tre..
int형 하나로만 숫자야구게임을 만들어보았다 아래와 같이 코드를 구성해보았다. 비트 Shift연산을 이용하고, not 비트연산등을 통해 비트 특정 부분 초기화 한후 숫자를 설정 할 수 있게도 하였다. #include #include #include #include //0~2 U #define set_Unibble(mem, index, value) ( mem = ( mem & ~( 0x0F ( index * 4 ) ) & 0x0F)) //0~2 P #define set_Pnibble(mem, index, value) ( mem |= ( value > (( index * 4 ) + 12) & 0x0F)) //0 ball, 1 strike #define set_2bit(mem, index, value) (mem = (mem & ~(0x03
포인터를 해보자 - 고등학생이 알려주는 C언어 C언어를 사용하는 이유 pointer(포인터)* 나, 오동현은 C언어의 포인터의 기본적이고 아주 기본적인 예제와 설명들을 이 문서에 기록해두었다. 먼저, 이렇게 C언어에서 이렇게 주소를 다룰 수 있을지 고민을 해보았는가? int t=3; int b; &b = &t; 한번 우리 모두 실행을 해보고 아래의 글을 읽어보자! 기본적으로 C에서 포인터는 아래와 같다. int *a; 이렇게 * 연산자만 사용해주면 포인터가 사용이 가능하다. 포인터 연산자를 사용하면 a라는 별칭의 변수에 어떠한 주소를 저장할 수 있다. 그러면 과연 a라는 별칭의 (주소를 저장하는)포인터 변수에 어떻게 b의 주소를 저장 할 수 있을까? 아래의 두가지 방법이 있다. 이 두가지 방법을 무조건 숙지해야한다. 그래야 포인터를 사용 할 수 있다..
하노이의 탑 (제귀) #include void hanoi(int n, char a, char b, char c) { if(n==1) { printf("%d : %c -> %c\n",n,a,c); } else { hanoi(n-1, a,c,b); printf("%d : %c -> %c\n", n,a,c); hanoi(n-1,b,a,c); } } int main() { int n; scanf("%d", &n); hanoi(n, 'A', 'B', 'C'); return 0; }
2606번 바이러스 March 26, 2022 내가 여러 알고리즘을 배우며, 이 코드 또한 쓰는 시간이 길어지겠구나 생각했지만 아니었다. 엄청나게 빠르게 코드가 써졌다. 게다가 이 문제는 DFS나 BFS 둘 중 하나를 골라서 써도 되었다. 나는 일반적인 그래프 탐색 기법을 활용하여 코드를 써보았는데 정답이 나와서 너무 행복했다. 그리고 출력할 때 1을 빼주는데 시작 노드를 제외 시키기 위함이다. 왜냐하면 시작 컴퓨터로부터 감염된 컴퓨터의 개수를 구하는 것이기 때문이다. 아래에 내가 코드를 작성해두었고 문제 링크도 임베드해두었다. https://www.acmicpc.net/problem/2606 2606번: 바이러스 첫째 줄에는 컴퓨터의 수가 주어진다. 컴퓨터의 수는 100 이하이고 각 컴퓨터에는 1번 부터 차례대로 번호가 ..