본문 바로가기

분류 전체보기

(308)
[C++] 다차원배열 c에서는 내부적으로 1차원 배열만을 지원한다. 그래서 다차원 배열을 c에서는 위와 같이 구현한다. ar 2차원 배열은 ar[0], ar[1], ar[2] 세개의 부분배열을 가진다. ar[0]은 부분배열의 배열명이므로 ar[0][0]의 첫번째 번지를 의미한다.
[C++] 이중 포인터 이중 포인터는 함수가 포인터를 변경할 수 있게 한다. void InputName(char **pName) { *pName=(char *)malloc(12); strcpy(*pName,"Cabin"); } void main() { char *Name; InputName(&Name); printf("이름은 %s입니다\n",Name); free(Name); } main에서 InputName함수에 Name 포인터변수의 번지, 이중포인터를 전달한다. InputName함수는 매개변수로 &Name을 받기 때문에 InputName함수 내부에서 *pName은 Name이 된다. 그래서 결과적으로 포인터변수 Name에 메모리를 할당하고 문자열을 복사하게 된다. void InputName(char *pName) { pName..
[C++] malloc,calloc,realloc void *malloc(size_t size ); malloc 함수는 size만큼의 메모리를 힙 영역에 할당하고 할당한 메모리의 첫 번지를 void 포인터로 반환한다. int *arScore; int stNum; printf("학생수를 입력하세요 : "); scanf("%d",&stNum); arScore=(int *)malloc(stNum*sizeof(int)); if (arScore == NULL) { printf("메모리가 부족합니다.\n"); exit(0); } 할당은 정수형 포인터에 malloc으로 얻은 void형 포인터를 대입하는 것으로 이루어지기 때문에 해당 포인터의 자료형대로 캐스팅을 해줘야 한다. 할당할 메모리가 부족해서 할당에 실패하면 NULL을 반환한다. void free(void *..
[C++] 정수형 포인터와 void형 포인터 정수형 포인터 만약 배열에서 다음 값을 읽기 위해 포인터 변수에 1을 더했을 때 번지가 1만큼만 이동한다면 문제가 발생할 것이다. 왜냐면 int는 4바이트를 차지하고 double이 8바이트인 것처럼 데이터 자료형이 모두 1바이트만 차지하는 것이 아닐뿐만아니라 자료형마다 크기가 모두 다르기 때문이다. void main() { int ar[]={1,2,3,4,5}; int *pi; pi=ar; printf("첫 번째 요소 = %d\n",*pi); pi++; printf("두 번째 요소 = %d\n",*pi); } 위 배열 ar은 1부터 5까지 정수를 담고 있다. ar(배열명)은 그 자체로 배열의 첫번째 요소를 가리키는 포인터이기 때문에 pi = ar은 성립한다. pi++는 pi가 가리키고 있는 번지수에 1만..
[C++] 비트 연산자, 쉬프트 연산자 비트 연산자는 메모리에 직접 접근해서 비트를 계산하는 연산자이다. 종료는 6가지가 있고 쉬프트 연산자도 비트 연산자에 포함된다. ~ 비트를 반전시킨다. & 대응되는 비트가 모두 1일 때 1이다. | 대응되는 비트가 모두 0일 때 0이다. ^ 두 개의 비트가 달라야 1이다. 지정한 수만큼 오른쪽으로 비트들을 이동시킨다. &연산은 어떤 비트와 0이 &되는 비트는 무조건 0이되고 1과 &되는 비트는 원래 비트를 유지한다. 이 연산을 마스크 오프라고 한다. |연산은 어떤 비트와 0이 |되는 비트는 원래 비트를 유지하고 1과 |되는 비트는 무조건 1이 된다. 이 연산을 마스크 온이라고 한다. 비트에 반전하고 &연산을 하면 특정 자리의 비트만 뺄 수 있다.
[백준] 11047번, 1931번 - 그리디 알고리즘 그리디 알고리즘은 탐욕법이라고도 부르는데, 현재의 상황에서 최선을 선택하는 방법이다. 현재의 상황에서 최선을 선택하는 것이 항상 최선의 선택이라고는 볼 수 없는데, 왜냐하면 지금 말하면 마시멜로를 1개 주고 1분 뒤에 말하면 1개를 더 준다고 했을 때 최선의 방법은 1분 기다려서 2개 먹는 것이지만 그리디 알고리즘은 현재의 1개를 선택한다. 그래서 탐욕법이라고도 한다. 그리디 알고리즘을 사용하는 경우를 문제 2개로 나누어서 보겠다. 11047번 - 거스름돈을 낼 수 있는 최소 동전 개수 구하기 거스름돈을 낼 수 있는 동전의 최소 개수를 구하는 법은 먼저 낼 수 있는 가장 큰 단위의 동전부터 내고 보는 법이다. 그래서 현재 낼 수 있는 가장 큰 단위의 동전을 내고 그 후에 그 다음 단위의 동전을 내고 하는..
[백준] 1003번 - 동적 계획법 int fibonacci(int n) { if (n == 0) { printf("0"); return 0; } else if (n == 1) { printf("1"); return 1; } else { return fibonacci(n‐1) + fibonacci(n‐2); } } 위는 n번째 피보나치 수를 구하는 함수이다. 이렇게 재귀호출을 이용하면 6번째 피보나치 수를 구하는 걸 예시로 들었을 때 fibo(6)은 fibo(4)와 fibo(5)를 호출하고 fibo(5)는 fibo(3)과 fibo(4)를 호출하는 과정을 반복하게 되는데 이 과정에서 fibo(4)는 2번 호출되고 밑으로 내려갈 수록 같은 계산이 여러번 이루어지게 된다. 그래서 동적 계획법은 불필요한 동일 연산을 줄이기 위해 한번 계산한 함수..
[백준] 15649번 - 백트래킹 알고리즘, DFS #include #define MAX 9 using namespace std; int n, m; int arr[MAX] = { 0, }; bool visited[MAX] = { 0, }; void dfs(int cnt) { if (cnt == m) { for (int i = 0; i < m; i++) cout m; dfs(0); } 1부터 N까지 자연수 중에 중복없이 M개를 뽑는 수열을 모두 출력한다. 이 과정에서 백트래킹을 이용한 DFS(깊이 기반 탐색)를 이용한다. i루프가 1부터 돌면서 방문하지 않은 노드에 방문했다고 true로 체크하고 cnt에 1을 더해서 재귀 호출하고 동일하게 반복한다. 그리고 조건을 달성했을 때 (cnt가 m과 같아졌을 때) return으로 함수를 종료하고 재귀호출로 스택에 ..