전체 글 143

TIL 2025 04 17 크롤링 / 코드리뷰 내용 정리

목차1. 삼항 연산자, 줄바꿈, 예외 처리 관련 개선 2. Parser 인스턴스 변수화 3. HTTP 요청 책임 분리 4. JSON 응답 처리 개선 및 범용성 확보 5. 부모 클래스 재활용 및 예외 처리 개선 1. 삼항 연산자, 줄바꿈, 예외 처리 관련 개선1-1. 리뷰 요지PEP8 기준 한 줄 최대 79자 제한.삼항 연산자는 간결한 경우에만 사용 권장.try 문은 예외 발생 가능 코드에 한정해야 명확함. 1-2. 반영 내용 및 설명 기존 코드self._html = ( request_html(self.url) if isinstance(parser_instance, RequestParser) else download_html(self.url)) 수정 방향삼항 연산자가 길어지면 가독성 저하 -..

카테고리 없음 2025.04.17

TIL 2025 04 16 CS50 / 스택, 큐, 딕셔너리 자료구조 정리

목차큐 (Queue)스택 (Stack)딕셔너리 (Dictionary)각 자료구조의 활용 및 비교 1. 큐 (Queue) 큐는 선입선출(FIFO: First-In First-Out) 방식으로 동작하는 선형 자료구조. 가장 먼저 들어온 데이터가 가장 먼저 나감. 1-1. 특징입장과 퇴장이 반대 방향에서 일어남줄 서기, 프린터 작업 대기열 등에 활용배열 또는 연결 리스트 기반으로 구현 가능 1-2. 예시#include #define SIZE 100int queue[SIZE];int front = 0, rear = 0;void enqueue(int value) { if (rear 코드 흐름enqueue 함수로 큐에 값을 삽입하며, rear 인덱스를 한 칸 이동dequeue 함수로 front 인덱스에 위치..

카테고리 없음 2025.04.16

TIL 2025 04 12 CS50 / 트라이(Trie) 자료구조

목차트라이의 개념 및 구조트라이의 동작 방식트라이의 시간 복잡도와 효율성해시 테이블과 비교 1. 트라이의 개념 및 구조트라이는 문자열을 저장하기 위해 특화된 트리 형태의 자료 구조로, 노드들이 문자 배열 형태로 구성되어 있음. 각 노드는, 다음 문자로 이어지는 자식 노드들을 배열 형태로 가짐. (영어 알파벳 기준으로 보면 각 노드는 최대 26개의 포인터(또는 링크)를 가짐.) 1-1. "hello"를 저장할 경우루트 노드에서 'h' 자식 노드로 이동그 다음 'e' 자식 노드로 이동'l' → 'l' → 'o' 순으로 이동하며 노드 연결이 구조를 통해, 공통 접두사를 갖는 문자열들이 같은 경로를 공유 가능.  2. 트라이의 동작 방식 Hermione, Harry, Hagrid를 트라이에 저장예를 들어, "H..

카테고리 없음 2025.04.12

TIL 2025 04 11 CS50 / 해시테이블

목차해시 테이블 (Hash Table) 해시 함수의 개념과 구현 방법해시 테이블 구조와 작동 원리해시 충돌과 해결 방법해시 테이블의 시간 복잡도 1. 해시 테이블 (Hash Table) 데이터를 해시 함수를 통해 적절한 위치(버킷)에 저장함으로써, 빠른 데이터 검색을 가능하게 하는 자료 구조.일반적으로 검색, 삽입, 삭제를 평균 O(1)의 시간 복잡도로 처리 가능.  전통적인 배열, 연결 리스트, 트리와 달리 해시 테이블은 key를 통해 직접 접근 가능=> (다만, 해시 함수의 품질과 충돌 해결 방식에 따라 성능 차이 발생)기본 개념은 "해시 함수로 키를 변환 => 배열 인덱스로 사용 => 해당 인덱스에 값을 저장"예를 들어 "apple"이라는 값을 저장한다고 할 때, 이 값을 숫자로 변환하고 특정 크기..

카테고리 없음 2025.04.11

TIL 2025 04 10 CS50 / 연결리스트 시연, 트리

목차연결 리스트 시연배열과 연결 리스트 비교배열이 정렬되지 않았을 때의 검색 시간 비교연결 리스트 기반 트리 구조 이해이진 검색 트리의 장단점 1. 연결 리스트 시연 연결 리스트는 데이터를 선형으로 저장하는 구조로, 각 노드가 다음 노드를 가리키는 포인터를 포함. 중요각 노드는 값과, 다음 노드의 주소를 포함중간에 노드를 추가할 경우 포인터만 수정하면 됨배열처럼 연속된 메모리 공간 필요 없음그러므로, 삽입/삭제가 자주 일어나는 환경에서 유리. 1-1. 예시node *list = NULL;node *n = malloc(sizeof(node));n->number = 1;n->next = NULL;list = n;이후 노드를 계속 이어 붙이며 리스트를 확장 가능. 2. 배열과 연결 리스트 비교 배열: 임의 접..

카테고리 없음 2025.04.10

TIL 2025 04 09 CS50 / 연결리스트 도입, 코딩

목차연결 리스트배열과의 차이점 및 장단점 비교연결 리스트 구조체 정의연결 리스트 구현 예시연결 리스트의 중간 삽입 및 삭제 1. 연결 리스트 연결 리스트(Linked List)는 메모리를 효율적으로 관리하기 위한 자료 구조로, 데이터와 다음 데이터를 가리키는 포인터로 구성된 노드(node)들의 모음. 배열은 메모리 상에 연속적으로 저장되지만, 연결 리스트는 각각의 노드가 메모리의 흩어진 공간에 존재하면서 다음 노드의 주소를 기억함으로써 연결. [1 | *] -> [2 | *] -> [3 | NULL] 각 노드는 두 개의 필드를 가진다데이터 값 (예: 1, 2, 3)다음 노드의 주소를 가리키는 포인터2. 배열과의 차이점 및 장단점 비교  1. 배열의 장점인덱스 기반으로 빠른 접근 가능메모리 캐싱 효율 높음..

카테고리 없음 2025.04.09

TIL 2025 04 08 CS50 / 배열의 크기 조정, 메모리 재할당

목차배열 크기 조정이 어려운 이유메모리 재할당의 기본 원리malloc과 수동 복사 방식realloc을 이용한 재할당임시 메모리를 새로 할당하는 이유 1. 배열 크기 조정이 어려운 이유C 언어에서 배열은 한번 선언하면 크기 변경 불가. int arr[3];위처럼 선언하면, 이 배열은 정확히 3칸만 사용 가능.그 이유는 메모리 공간이 연속적으로 배정되기 때문.만약 그 옆 공간에 이미 다른 데이터가 존재하면 배열을 확장 불가능.즉, 기존 공간을 확장하는 것이 아니라 새로운 공간에 복사해야 한다.  2. 메모리 재할당의 기본 원리 2-1. 배열 크기를 늘리기 위한 일반적 방식새로운 메모리 공간을 malloc으로 할당기존 배열의 데이터를 for 루프로 복사기존 배열 메모리를 free포인터를 새로운 배열로 이동 이..

카테고리 없음 2025.04.09

TIL 2025 04 07 CS50 / 파일 읽기, 쓰기

목차사용자 입력 함수 직접 구현 (get_int, get_string, get_long, get_float, get_char)파일 쓰기 (fopen, fprintf, fclose)파일 읽기와 JPEG 파일 판별다양한 파일 형식의 식별 방식메모리 영역을 나누는 이유 1. 사용자 입력 함수 직접 구현 1-1. get_int 구현 방식#include int main(void) { int x; printf("x: "); scanf("%i", &x); printf("x: %i\n", x);}scanf를 통해 정수 입력 받음.주소 연산자 & 필수. 1-2. get_string 구현 방식#include int main(void) { char s[5]; printf("s: "); ..

카테고리 없음 2025.04.07

TIL 2025 04 06 CS50 / 메모리 교환, 스택, 힙

목차값 교환의 문제와 원인함수 호출 시 복사되는 값메모리 영역 구조: 스택, 힙, 등포인터를 이용한 교환메모리 영역을 나누는 이유  1. 값 교환의 문제와 원인  두 정수 값을 교환하려는 코드 예시#include void swap(int a, int b);int main(void){ int x = 1; int y = 2; printf("x is %i, y is %i\n", x, y); swap(x, y); printf("x is %i, y is %i\n", x, y);}void swap(int a, int b){ int tmp = a; a = b; b = tmp;}  출력x is 1, y is 2x is 1, y is 2겉보기에 swap() 함수는 a, b의 값..

카테고리 없음 2025.04.06

TIL 2025 04 05 CS50 / 메모리 할당과 해제

목차메모리 동적 할당메모리 누수  (Memory Leak) 버퍼 오버플로우 (Buffer Overflow)메모리 해제 방법 및 free 함수Valgrind를 통한 메모리 오류 검사제한된 메모리 환경에서 해제하지 않았을 때 발생할 수 있는 문제  1. 메모리 동적 할당 프로그램 실행 중에 필요한 만큼 메모리를 직접 할당할 수 있는 기능을 동적 메모리 할당이라고 한다.C 언어에서는 malloc 함수를 이용해 특정 크기의 메모리를 요청 가능.  int *x = malloc(10 * sizeof(int)); 위 코드는 int형(4바이트) 변수 10개를 저장할 수 있는 메모리(총 40바이트)를 힙 영역에 동적으로 할당.할당된 메모리의 시작 주소가 포인터 x에 저장.  2. 메모리 누수  (Memory Leak) ..

카테고리 없음 2025.04.05