목록분류 전체보기 (131)
세리프 따라잡기
#malloc / free / colloc 함수 참고 #메모리 동적할당 참고 메모리 동적할당이란? = 프로그램이 작동하는 도중에 할당받고자 할 때 사용하는 방법, 동적 할당된 메모리는 힙(heap)영역에 malloc과 free를 사용해 할당되고 해제된다. 각 칸을 4바이트 차이만큼 표시한 이유는 32bit 시스템의 경우엔 포인터의 사이즈가 4byte이기 때문에 64bit인 경우엔 CPU의 메모리 접근을 위한 주소가 64bit 만큼 가능하기 때문에 8byte가 된다. 파란색 부분은 할당된 부분, 흰색 부분은 할당이 해제된 부분. 그림은 차례로 할당과 해제된 부분을 그렸지만, 할당된 부분들은 얼마든지 연속적으로 붙어있거나 떨어져있을 수 있다. but, 할당 해제된 부분은 단편화 문제를 해결하기 위해 연속적으..
struct NODE { // 연결 리스트의 노드 구조체 struct NODE *next; // 다음 노드의 주소를 저장할 포인터 int data; // 데이터를 저장할 멤버 }; 연결리스트는 노드들의 집합이라 실제로는 노드의 구조체만 정의하면 된다. node 구조체에서 가장 중요한 부분은 struct NODE *next이다. 얼핏 보면 구조체 자기 자신의 포인터를 멤버로 가지고 있는데, 전혀 어려운 게 아니다! next에는 NODE구조체로 만든 다른 노드의 메모리 주소를 저장한다. 즉, 자기 자신이 아닌 다른 노드의 메모리 주소를 저장한다는 점!!! 단일 연결 리스트에서 노드 종류 [노드 역할에 따라 두 가지로 나뉨] - 머리노드(head node): 단일 연결 리스트의 기준점, 첫 번째 노드를 가리키..
- 포인터 printf("%p\n", &변수명) >> 변수의 메모리 주소를 구함 자료형 *포인터이름 >> 포인터 변수 선언 포인터 = &변수명; >> 변수의 메모리 주소를 포인터 변수에 저장 printf("%d\n", *포인터) >> 역참조 연산자, 포인터명의 메모리 주소에 접근해 값을 가져옴 *포인터 = 값 >> 역참조 연산자를 사용한 뒤에 갑을 저장하는 것. [값을 가져올수도, 저장할 수도 있음] void *포인터이름 >> 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장가능 ㄴ> 단, void 포인터로는 역참조를 할 수 없고, 변수를 선언할 수도 없다. 자료형 **포인터이름 >> 포인터의 메모리 주소를 저장하는 포인터의 포인터를 선언 [이중 포인터] ㄴ> 포인터도 실제로는 ..
Red-Black Tree : 가장 많이 사용되는 균형 이진 탐색 트리 NIL = c언어에서는 NULL / 파이썬에서는 None을 의미하는 노드를 말하는 것 앞에 트리를 설명할 때 none값에 대해 그림상 표현하지 않는다 (아무것도 없기 때문에) 하지만 RBtree에서는 독립된 노드로 그린다. 그리고 이 노드를 '리프 노드(leaf)'라고 부른다. 리프 노드를 제외한 노드를 '내부 노드'라고 한다. RBtree는 다음의 5가지 조건을 만족해야만 한다. [당연히 이진 탐색 트리] 1. 모든 노드는 Red나 Black의 색깔이 있어야 한다. (둘중에 하나 무조건) 2. 루트 노드는 무조건 Black이어야 한다. 3. 리프 노드 또한 무조건 Black이어야 한다. 4. red node는 두 개의 자식 노드를 ..
- 변수 / 주소 연산자 / 역참조 연산자 / 포인터의 차이 1. 포인터 사용하기 변수는 어디에 생기는 걸까? 변수는 컴퓨터의 메모리에 생성된다. 메모리에 일정한 공간을 확보해놓고, 원하는 값을 저장하거나 가져오는 방식이다. 포인터가 어렵게 느껴진다면? 메모리를 이해하지 못한 것! > 메모리를 이해하면 어렵지 않다. 보통 변수는 이름으로 사용하는데, 변수는 메모리의 특정 장소에 위치하고 있으므로 메모리 주소로도 표현할 수 있음 == 일상생활에서 집을 구분할 때 주소를 사용하는 것과 같은 원리. 변수의 메모리 주소를 구해보자. &변수 ← 사용법 #include int main(){ int num1 = 10; printf("%p\n", &num1); //0x7fff61f81fe4 → 메모리 주소 출력. 컴퓨..
1. include와 헤더파일 - 헤더파일이란? c언어의 문법을 가지고 있는 프로그램. 헤더파일이 코드에 추가되어 있지 않다면, 컴퓨터는 아무것도 하지 못한다. (컴퓨터가 글자들을 알아볼 수가 없어서) == 헤더파일이 없다면 컴퓨터가 컴파일을 못한다. #include //stdio.h is inputed #include //stdilb.h is inputed 2. main 함수 - c언어는 프로그램이 시작되면 무조건 main부터 찾기 때문에 main 함수 안에 코드를 짜야 명령어가 실행된다. main 앞에 쓰는 int의 의미는 정수 '-21억' ~ '+21억'을 의미하는데, 이는 main의 반환값을 의미한다. 따라서 반환값에 따라 반환을 해야 하는 값이 다른데, 반환값을 정하지 않으면 무조건 0으로 반환..
1. AWS-EC2 linux에 연동 AWS 홈페이지에 접속해서 다음과 같은 화면으로 들어간다 인스턴스를 누르고 인스턴스 ID를 클릭하면 아래와 같은 화면이 나오는데, 여기서 저 퍼블릭 IPv4주소가 필요하다! 복사 버튼을 눌러줘서 이제 터미널에 가서 연동해주자 ssh -i (발급받은 key.pem 경로 괄호 빼고 적기) ubuntu@(괄호 빼고 퍼블릭 IPv4주소 복붙) 예시. → ssh -i /c/Users/gothic/Desktop/malgun.pem ubuntu@13.111.111.11 이런식으로~ 이후 터미널창에 시작이 ubuntu@주소 로 바뀌었다면 성공 끗! 2. vscode C언어 연동 오류 (could not establish connection to '~') vscode에서 remote..
$ vi (file name)을 이용해 실행하면 편집기가 열리고 해당 편집기를 다 작성하고 저장 및 종료하고자 한다면 일단 esc키부터 눌러야 한다! 모드 명령키 설명 마지막 행 모드 :q vi에서 작업한 것이 없을 때 vi 종료 :q! 작업한 내용을 저장하지 않고 종료 :w[file name] 작업한 내용을 저장만 하고, 파일명을 지정하면 새 파일로 저장 :wq. :wq! 작업한 내용을 저장하고 vi를 종료 명령 모드 ZZ 작업한 내용을 저장하고 vi를 종료 참고한 사이트~
그리디(greedy) 알고리즘이란? = 그리디 알고리즘은 말그대로 탐욕적인 알고리즘을 말하는데, 선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫓아 최종적인 답에 도달하는 방법을 의미한다. = 일반적으로 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구한다. = 그리디 해법은 그 정당성 분석이 중요하다. [단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는지 검토] Q. 루트 노드부터 시작해 거쳐 가는 노드 값의 합을 최대로 만들면? A. 최적의 해는 5-7-9 현재 위치에서 가장 큰 값만 선택하는 방법 A. 루트(5)부터 시작해 현 위치에서 가장 큰 값을 선택하면 5-10-4가 된다. → 다만 이 상황에선 5+10+4=19라 최적의 해인 ..
https://www.acmicpc.net/problem/9084 9084번: 동전 우리나라 화폐단위, 특히 동전에는 1원, 5원, 10원, 50원, 100원, 500원이 있다. 이 동전들로는 정수의 금액을 만들 수 있으며 그 방법도 여러 가지가 있을 수 있다. 예를 들어, 30원을 만들기 위해서는 www.acmicpc.net Q> 2,4원으로 8원 만들기 동전 0원은 항상/무조건 1가지의 방법으로 만들 수 있다. - 4원짜리로 0원을 만드는 건 = 0개를 내면 만들 수 있음 = 1가지 방법 0 1 2 3 4 5 6 7 8 0원 1 0 0 0 0 0 0 0 0 0원+2원 1 0 1 0 1 0 1 0 1 0원+2원+4원 1 0 1 0 2 0 2 0 3 → dp[8] = dp[8-4] = dp[4] = 2 ..