본문 바로가기

Programming9

암호화된 데이터를 LZO (Lempel-Ziv-Oberhumer) 압축하면 왜 데이터 크기가 더 커질까? 0. 작성 배경?최근 RSA 암호화 데이터를 LZO 압축해 보관해야 하는 로직을 구현하던 중에, 암호화 데이터를 압축했을 때 오히려 사이즈가 더 커지는 현상이 발생했다. 왜 이런 현상이 발생했는지 알아보자. 1. 암호화 데이터는 무작위(random)한 특성을 가진다.LZO를 포함한 대부분의 압축 알고리즘(LZ77, LZ78 기반 알고리즘)은 데이터 내 반복되는 패턴을 찾아 제거하여 압축률을 높이는 방식으로 동작한다. 하지만 암호화된 데이터는 원래의 구조적 패턴이 제거된 상태이므로 압축 알고리즘이 더 이상 중복된 패턴을 찾을 수 없게 된다.즉, 압축 알고리즘이 패턴을 찾지 못하면 압축할 수 없으며, 오히려 압축 헤더 또는 메타데이터가 추가되면서 크기가 더 커질 수 있다. 2. LZO는 빠른 압축을 위해.. 2025. 3. 2.
Valgrind의 Invalid read 와 Invalid write에 대해 ※  아래 내용은 스스로 공부한 내용을 정리한 글입니다.     ※  때로 정확하지 않을 수 있으며, 참고만 부탁드립니다.     ※  잘못된 내용이 있을시 댓글로 알려주시면 감사하겠습니다. Invalid readInvalid read는 할당되지 않은 메모리로부터 값을 읽으려 할 때 발생되는 현상이다. malloc()해준 크기를 넘어 값을 읽거나, stack의 상단을 넘치게 읽었을 경우 Invalid read가 발생한다. valgrind에서 Invalid read 메시지가 나올 때는, 얼만큼의 바이트 크기를 초과로 읽어 들였는지 확인할 수 있다. 아래는 Invalid read의 샘플 코드이다.포인터 변수 p에 20 byte 크기를 할당했고, for 문으로 값을 채워주었다.하지만 변수 p를 printf 하.. 2023. 7. 18.
이중 포인터(double pointer) 이해하기 in C 포인터에 대해 간단히 말하자면,포인터란 해당 변수의 메모리 공간 주소를 가리키는 변수를 말한다. 변수에서 쓰는 * 표시는 역참조 표시이며, 해당 변수가 가리키는 메모리주소의 값을 가져오는 것을 의미한다. 사실 말로만 설명하면 이해하기 어려운 게 포인터다. 그래서 직접 주소값을 찍어보며 포인터 변수를 알아보았다.int a = 10;int *b = &a;int **c = &b;이렇게 세 가지의 변수를 선언했다. a는 정수형 변수,b는 포인터 변수,c 또한 포인터 변수지만 b와 달리 이중포인터로 선언했다. a와 b, c의 메모리 주소값을 보자.printf("a address : %p\\n", &a);printf("b address : %p\\n", &b);printf("c address : %p\\n", &c.. 2023. 7. 9.
[백준 4673번] [파이썬] 10000이하의 셀프넘버 구하기 / 코드분석 자세한 설명 정답 코드 전문# 4673# n을 d(n)의 생성자라고 하자.# 즉 d(n)은 생성자가 있는, 셀프넘버가 아닌 숫자다.natural = set(range(1, 10001)) # set안에 1부터 10000까지 숫자 생성generated = set() # 빈 set 설정for n in range(1, 10001): # 1부터 10000까지 for문 생성 for j in str(n): # d(n)을 구하기 위한 for문 n += int(j) # n(자기자신)에 각 자리수를 더해주어 d(n)을 구한다. generated.add(n) # d(n) 집어 넣기self_num = sorted(natural - generated) # 1~10000 set에서 생성자가 있는 d(n)들을 삭제하고 .. 2022. 4. 14.
[JAVA] [알고리즘 문제] DFS를 이용한 미로 최단거리 구하기 문제 스틴이는 N*M 크기의 직사각형 형태의 미로에 갇혀있다. 미로에는 여러 마리의 괴물이 있어 이를 피해 탈출해야 한다. 스틴이의 위치는 (1,1)이고 미로의 출구는 (N,M)의 위치에 존재하며 한번에 한칸씩 이동할 수 있다. 이때 괴물이 있는 부분은 0으로 괴물이 없는 부분은 1로 표시되어 있다. 미로는 반드시 탈출할 수 있는 형태로 제시된다. 이때 스틴이가 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하시오. (처음과 끝 칸 포함) 입력조건 첫째 줄에 두 정수 N,M(4101010 >111111 >000001 >111111 >111111 출력 예시 >10 힌트 1.맨 처음에 (1,1)의 위치에서 시작, 시작 값은 항상 1 2. (1,1)좌표에서 상,하,좌,우로 탐색을 진행 (1,2)위치의 값을 .. 2022. 4. 6.
[JAVA] [알고리즘 문제] 버전 비교하는 프로그램 / 내 풀이, 다른 풀이 비교 문제 버전 1과 버전 2의 두 버전 번호가 주어지면 비교합니다. 버전 번호는 점 '.'으로 결합된 하나 이상의 구분된 형태로 구성됩니다. 각각의 구분된 형태는 숫자로 구성되며 선행 0을 포함할 수 있습니다. 버전 번호를 비교하려면 수정 버전을 왼쪽에서 오른쪽으로 순서대로 비교합니다. 선행 0을 무시한 정수 값을 사용하여 비교됩니다. 이것은 1과 001이 동일하다고 간주됨을 의미합니다. 버전 번호가 인덱스에서 구분된 형태로 지정하지 않으면 형태를 0으로 처리하십시오. 예를 들어 버전 1.0은 버전 1.1보다 작지만 버전 0과 버전 1은 0 버전 2, 1을 출력 - 나머지 경우는 0을 출력 예 1 입력 : versio.. 2022. 4. 5.
[JAVA][알고리즘 문제]DFS(Depth-first Search)를 활용한 얼음 틀 문제 문제 N * M 크기의 얼음 틀이 있다. 구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다. 구멍이 뚫려 있는 부분끼리 상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다. 이 때 얼음 틀의 모양이 주어졌을 때 생성되는 총 아이스크림의 개수를 구하는 프로그램을 작성하시오. 입력 예시 >4 5 >00110 >00011 >11111 >00000 출력 예시 >3 DFS(Depth-first Search)란? 깊이 우선 탐색이라는 알고리즘이다. "더 나아갈 길이 보이지 않을 때까지 깊이 들어간다"를 원칙으로 한다. 그래프 내의 정점을 방문한다. 마치 미로찾기 처럼. 특징은? 자기 자신을 호출하는 순환 알고리즘이다. 트리 순회(전위, 중위, 후위 순회)는 모두 DFS의 한.. 2022. 3. 31.
[DB] 데이터베이스의 이해 목차1. 데이터베이스의 정의2. DBMS의 특징3. DBMS의 분류와 종류데이터베이스의 정의 데이터베이스, DB란?컴퓨터 기억 장치 내에 체계적으로 분류하고 정리하여 모아놓은 데이터의 집합이다.조직에서 여러 업무에 사용된다.통합된 데이터의 집합데이터의 중복을 최소화하여 효율성을 증진저장된 데이터의 집합컴퓨터에 의해 접근 가능한 매체에 저장운영 데이터의 집합고유 기능 수행을 위해 필요한 데이터의 집합공용 데이터의 집합사용자와 시스템이 공동으로 소유하고 사용하는 데이터의 집합 파일 처리 시스템과의 차이?파일 처리 시스템은 DB 사용 이전의 데이터 처리, 관리 기법이다. 데이터 처리를 위한 애플리케이션 프로그램이 파일에 직접 접근하여 데이터를 저장하고 읽는 방식이다. 파일 처리 시스템을 사용할 경우 조직에서의.. 2022. 3. 8.
[Python] [알고리즘 문제] 리스트를 이용해서 피보나치 수열 만들기 피보나치 수는 첫째 및 둘째 항이 1이며 그 모든 항은 바로 앞 두 항의 합인 수열이다. 따라서 처음 여섯 항은 각각 1, 1, 2, 3, 5, 8이다. 즉, 이후의 항들이 이전의 두 항을 더한 값으로 이루어지는 수열을 말한다. 파이썬으로 정수 n을 입력받아 n 이하까지의 피보나치수열을 출력해보자. 첫 번째 항은 편의상 0이라고 정의했다. n = int(input("num? : ")) # n 입력 li = [0, 1] # 최초 li 정의 print('0',end='') # 최초 0부터 프린트 while (li[0]+li[1]) 2022. 3. 4.