Language 25

[파이썬] tkinter (2) - PDF 페이지 추출 프로그램

tkinter 개요   지난 시간에는 GUI에서 기초적인 라벨을 생성하고 창을 띄우는 작업을 해보았다. 이번 시간에는 이미지를 삽입하고 버튼을 생성하여 이벤트를 할당하는 방법에 대해 알아보겠다. 또한 입력을 받는 Dialog를 생성하여입력을 받고, 이를 이용한 프로그램을 만들어 보겠다.본문위젯 - 백그라운드 이미지 설정   오늘의 목표는 버튼을 클릭하면 PDF 파일을 선택하는 창이 뜨고, 해당 PDF 파일에서 특정 페이지를 추출하는 프로그램을 만드는 것이다. 먼저 그럴싸한 프로그램을 만들기 위해 백그라운드 이미지를 설정할 것이다. 이미지를 다루기 위해 다음과 같이 pillow 라이브러리를 설치하자.  pip install pillow   PIL(Python Imaging Library)은 Python에서..

Language/Python 2024.06.29

[파이썬] tkinter (1)

tkinter개요  파이썬에는 다양한 GUI(Graphical User Interface) 라이브러리가 존재한다. 그중, Python 표준 라이브러리인 tkinter는 Python과 함께 배포되므로 별도의 설치가 필요하지 않다. 이번 시간에는 해당 라이브러리를 통해 간단하게 GUI를 생성하는 방법에 대해 알아보도록 하겠다.GUI: 사용자가 컴퓨터와 상호작용할 수 있는 시각적 인터페이스. 텍스트 기반 인터페이스와 달리 아이콘, 버튼, 윈도우, 라벨 등 시각적 요소를 사용하여 직관적이고 사용하기 쉽게 만들 수 있다본문위젯 - 윈도우(Window)   윈도우는 기본적인 애플리케이션 창을 의미한다. Tkinter에서 하나의 기본 창을 생성하고 실행하는 방법을 예제로 설명해 보겠다. import tkinter a..

Language/Python 2024.06.24

[C++] std::binary_search

이진 탐색 개요 예전 이진 탐색에 대한 개념적인 부분을 해당 글에서 다룬 적이 있었다. 다시 상기하자면, 정렬된 배열을 반으로 나눠가며 원하는 값을 찾는 알고리즘이 이진 탐색이다. 이번 시간에는 해당 알고리즘을 구현한 std::binary_search 함수에 대한 사용법을 알아보도록 하자. 본문 사용법 이진 탐색 또한 탐색의 일종이므로, 배열 내에서 특정 요소가 존재하는지 확인할 때 사용된다. 이때 대상 범위가 이미 정렬되어 있어야 하며, 중복 요소가 있는 경우 어느 요소인지 알 수 없다. 이는 함수가 단순히 주어진 값이 배열 내에 존재하는지 여부만을 체크하기 때문이다. #include #include #include int main() { std::vector v = { 1, 2, 4, 5, 9, 10..

Language/C++ 2024.03.11

[C] 구조체(Structure)

구조체 개요 프로그래밍을 하다 보면 서로 다른 타입의 변수들을 하나의 단위로 묶어야 할 때가 있다. 예를 들어, 학생들의 점수를 관리하는 프로그램을 만든다고 가정해 보자. 학생들의 이름을 저장해야 하므로 문자형 배열, 점수가 필요하므로 정수, 혹은 실수형 데이터가 필요할 것이다. 즉, 학생 한 명당 여러 개의 변수가 필요하므로, 학생 수가 많아질수록 관리해야 할 변수의 수가 기하급수적으로 늘어난다. 이는 가독성의 저하와 코드의 복잡성 증대로 인해 오류 발생 가능성을 야기한다. 이런 문제점을 해결하기 위한 방법으로 구조체를 사용하는 것이 매우 효과적이다. 구조체(Struct)는 서로 다른 타입의 변수들을 하나의 논리적 단위로 묶는 사용자 정의 타입이다. 위의 예시에서 구조체를 이용하여 각 학생들의 정보를 ..

Language/C 2024.01.31

[C] 메모리 동적 할당

동적 할당 개요 이번 시간에는 C 언어의 핵심 요소 중 하나인 메모리 관리와 동적 할당에 대해 집중적으로 살펴보겠다. 동적 할당(Dynamic Allocation)은 프로그램 실행(런타임) 도중 필요한 메모리 공간을 할당하는 과정으로, 메모리 자원이 제한적인 환경에서 특히 중요하다. C 언어는 malloc, calloc, realloc, free와 같은 함수를 통해 개발자가 메모리를 효율적으로 관리할 수 있도록 지원한다. 이러한 동적 할당 메커니즘을 통해, 개발자는 필요한 메모리만을 할당하고, 사용이 끝난 메모리를 해제함으로써 시스템의 메모리 사용을 최적화할 수 있다. 본문 사용 이유 동적 메모리 할당과 해제는 C언어에서 메모리 사용의 효율성을 높이는 중요한 역할을 한다. 정적 할당 방식에서는 프로그램이..

Language/C 2024.01.29

[C] 포인터(Pointer)

Pointer 개요 포인터(Pointer)는 프로그래밍에서 광범위하게 사용되는 개념으로, 특히 C 언어와 같은 저수준 프로그래밍 언어에서 중요한 역할을 한다. 포인터는 메모리의 주소를 저장하고, 이를 통해 다양한 데이터에 간접적으로 접근할 수 있는 변수다. C 언어에서 포인터는 메모리 관리, 배열과 문자열 처리, 동적 메모리 할당, 데이터 구조체 구현 등 여러 분야에서 핵심적인 도구로 사용된다. 이러한 포인터의 사용은 프로그램의 유연성과 효율성을 높이는 동시에, 복잡하고 섬세한 메모리 관리를 가능하게 한다. 본문에서는 포인터가 C 언어에서 어떻게 동작하며, 왜 그렇게 널리 사용되는지에 대해 자세히 살펴보겠다. 본문 사용 이유 포인터를 사용하면 메모리를 효율적으로 사용할 수 있다. 이는 포인터를 사용하면 ..

Language/C 2024.01.22

[Python] PDF 텍스트 추출

PDF 텍스트 추출 개요 대학교에서 하는 수업들은 대게 PDF로 진행한다. 그래서 해당 내용을 정리할 때 PDF에 있는 텍스트 내용을 추출하면 편한 경우가 많다. 구글에 PDF 텍스트 추출을 검색하면 다양한 플랫폼이 나오지만, 직접 커스터마이징을 하고 싶어 파이썬으로 구현해 보았다. 본문 PyPDF2 파이썬에서는 Python으로 작성된 PDF 파일을 다루기 위한 라이브러리다. 이 라이브러리를 사용하면 PDF 파일을 읽고, 쓰고, 분할하는 등 다양한 작업을 수행할 수 있다. 이번 시간에는 파일을 읽는 것이 목적이므로 관련 함수인 PdfReader에 대해 알아보자. 일반적으로 PdfReader는 페이지 수 얻기, 개별 페이지 접근 등 다양한 읽기가 가능하다. 아래는 그 예제이므로 참고하자. # PDF 파일 ..

Language/Python 2023.10.31

[Python] matplotlib(1)

matplotlib 개요 matplotlib는 파이썬의 시각화 라이브러리로, 다양한 그래프와 차트를 생성하는 데 사용된다. 보통 numpy 혹은 pandas와 묶어서 배열을 바로 그래프로 시각화할 때 자주 사용하는데, 이번 시간에는 간단한 예제들을 통해 어떻게 그래프를 플로팅하는지 알아보도록 하자. 본문 설치 및 임포트 pip install matplotlib 커맨드창에 matplotlib를 설치하기 위해 해당 명령어를 실행시키자. from matplotlib import pyplot as plt import matplotlib.pyplot as plt 기본적인 그래프 모듈은 pyplot을 사용하며, 임포트는 관례적으로 plt를 약어로 사용한다. 그래프 그리기 pyplot.plot() pyplot.sho..

Language/Python 2023.09.12

[C++] 중복 처리 (2)

본문 중복 인덱스 처리 #include #include #include #include int main() { unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); std::mt19937 generator(seed); std::vector word_pairs = { {"game", "게임"}, {"start", "시작하다"}, {"smart", "똑똑한"}, {"string", "문자열"}, {"combination", "조합"}, {"pair", "쌍"} }; 다음과 같이 벡터에 단어와 그 정의가 저장되어 있고, 여기서 무작위로 5개의 문제를 낸다고 해보자. 이때 중복된 문제가 없으려면 어떻게 해야 할까? std::sh..

Language/C++ 2023.09.08

[C++] 중복 처리 (1)

중복 처리 개요 지난번에 업로드된 게시글에서는 다양한 난수 생성 방법들을 알아보았다. 이러한 난수를 활용하여 시스템을 설계하게 되면, 중복 문제가 불가피하게 발생할 수 있다. 특히 무작위로 고유한 값을 생성하거나 선택하는 과정에서 중복은 예기치 않은 오류를 발생시킬 수 있다. 따라서 중복 처리는 이러한 시스템에서 필수적인 단계가 되어야 한다. 이번에는 난수 생성 시 발생하는 중복 문제와 그를 효과적으로 해결하는 방안들에 대해 살펴볼 예정이다. 특히, 중복된 값 자체의 처리와 중복 인덱스 처리, 이 두 가지 주제에 초점을 맞추어 알아보도록 하겠다. 본문 중복 제거 std::vector v = { 7, 7, 1, 2, 3, 5, 5, 2, 8 }; 다음과 같이 vector 배열에 중복된 값이 있다고 가정해 ..

Language/C++ 2023.09.07