본문 바로가기

STUDY 기록/CS507

[CS50] realloc, 연결 리스트, 트라이, 큐, 스택, 딕셔너리 realloc 일정한 크기의 배열이 주어졌을 때, 그 크기를 키우려면 어떻게 해야 할까요? 단순하게 현재 배열이 저장되어 있는 메모리 위치의 바로 옆에 일정 크기의 메모리를 더 덧붙이면 되겠지만, 실제로는 다른 데이터가 저장되어 있을 확률이 높습니다. 따라서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 합니다. 따라서 이런 작업은 O(n), 즉 배열의 크기 n만큼의 실행 시간이 소요될 것입니다. 이 과정을 아래 코드와 같이 나타낼 수 있습니다. #include #include int main(void) { //int 자료형 3개로 이루어진 list 라는 포인터를 선언하고 메모리 할당 int *list = malloc(3 * sizeof(int)); // 포.. 2022. 6. 23.
[CS50] 16진수, 메모리 주소, Malloc, SWAP, 파일 읽고 쓰기, 파일 형식 확인 16진수 컴퓨터과학에서는 숫자를 10진수나 2진수 대신 16진수(Hexadecimal)로 표현하는 경우가 많습니다. 컴퓨터에서 데이터를 처리하기 위해 16진수를 사용할 때 장점이 있기 때문입니다. JPG 이미지 파일은 항상 255 216 255 로 시작되고 이것은 10진수입니다. 하지만 실제 컴퓨터 내에서는 10진수를 사용하지 않습니다. 컴퓨터는 0과 1만을 이해할 수 있기 때문입니다. 먼저 255 216 255를 2진수로 나타내보면 과 같습니다. 2진수로 모든 데이터를 표현하기에는 너무 길어지기 때문에 16진수로 바꾸어 보겠습니다. 2^424 이 16이기 때문에 4bits씩 두 덩어리로 나누어 보면 0000 부터 1111까지는 16진수로 표현할 수 있다는 것을 알 수 있습니다. 그렇다면 16진수에서 1.. 2022. 6. 23.
[CS50] 선형 검색, 이진 검색, Big O & Ω 표기법, 버블 정렬, 선택 정렬, 재귀, 병합 정렬 선형 검색 배열의 인덱스를 처음부터 끝까지 하나씩 증가시키면서 방문하여 그 값이 속하는지를 검사합니다. 아래 의사코드와 같이 나타낼 수 있습니다. For i from 0 to n–1 If i'th element is 50 Return true Return false 주어진 배열에서 특정 값을 찾기 위해서 선형 검색을 사용한다면, 아래와 같은 코드를 작성할 수 있습니다. #include #include int main(void) { // numbers 배열 정의 및 값 입력 int numbers[] = {4, 8, 15, 16, 23, 42}; // 값 50 검색 for (int i = 0; i < 6; i++) { if (numbers[i] == 50) { printf("Found\n"); return .. 2022. 6. 21.
[CS50] 메모리, 전역 변수, 동적 선언 및 저장, 명령행 인자, 배열 메모리 C에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지합니다. bool: 불리언, 1바이트 char: 문자, 1바이트 int: 정수, 4바이트 float: 실수, 4바이트 long: (더 큰) 정수, 8바이트 double: (더 큰) 실수, 8바이트 string: 문자열, ?바이트 컴퓨터 안에는 아래 사진과 같은 RAM 이라고 하는 물리적 칩이 메모리 역할을 합니다. 쉽게 생각하면 아래 사진에서 여러 개의 노란색 사각형이 메모리를 의미하고, 작은 사각형 하나가 1바이트를 의미한다고 볼 수 있습니다. 예를 들어 char 타입의 변수를 하나 생성하고, 그 값을 입력한다고 하면 위 사진에서 한 사각형 안에 그 변수의 값이 저장되는 것이죠. 배열 #include #inc.. 2022. 6. 21.
[CS50] 전처리,컴파일링,어셈블링,링킹, 디버깅 방법 clang -o hello hello.c -lcs50 make나 clang을 사용해서 프로그램을 실행할 때 아래 네 개의 단계를 거칩니다. 전처리 컴파일링 어셈블링 링킹 우리가 명령어를 실행할 때 정확히 어떤 일이 일어나는지 알아보도록 하겠습니다. 전처리 컴파일의 전체 과정은 네 단계로 나누어볼 수 있습니다. 그 중 첫 번째 단계는 전처리인데, 전처리기에 의해 수행됩니다. # 으로 시작되는 C 소스 코드는 전처리기에게 실질적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려줍니다. 예를 들어, #include는 전처리기에게 다른 파일의 내용을 포함시키라고 알려줍니다. 프로그램의 소스 코드에 #include 와 같은 줄을 포함하면, 전처리기는 새로운 파일을 생성하는데 이 파일은 여전히 C 소스 코드 형태.. 2022. 6. 21.
[CS50] C언어 기초, 형식 지정자, 사용자 정의 함수, 하드웨어의 한계 C언어 하나하나 설명하자면 int main(void) 는 스크래치의 “초록색 깃발을 클릭했을 때” 블록과 같은 역할을 합니다.즉 '시작한다'의 의미를 가지고 있다고 보면 됩니다. 앞으로 우리가 작성할 코드 모두는 이 int main(void) { }의 중괄호 사이에 작성하게 될 것 입니다. printf(“hello, world\n”) 은 스크래치의 “‘hello, world’라고 말하기” 블록과 같은 역할을 합니다. 글자나 단어, 문장을 적을 때는 언제나 텍스트에 " " 쌍따옴표로 감싸야 합니다. 그리고 우리가 일상에서 문장의 끝에 마침표(.)를 붙이는 것 처럼 C에서는 세미콜론(;)을 붙여야 합니다. #include 는 “stdio.h”라는 이름의 파일을 찾아서 “printf” 함수에 접근할 수 있도록.. 2022. 6. 21.