본문 바로가기

프로그래밍118

에라토스테네스의 체(Sieve of Eratosthenes) 에라토스테네스의 체(Sieve of Eratosthenes)오늘은 "에라토스테네스의 체"에 대해서 알아보도록 하겠습니다. 일단 이 이름을 처음 듣는 분들은 딱봐도 이전에 말씀드린 유클리드 호제법 처럼 옛날에 만들어진 개념이라는 생각이 들 것 같습니다. 이 개념은 고대 그리스의 수학자 에라토스테네스가 만든 소수 판별 알고리즘으로, 1부터 특정 수 n까지의 모든 소수를 빠르게 구할 때 사용하는 효율적인 방법입니다. 원리일단 이름을 체라고 한 것을 보면 뭔가 거름망 혹은 걸러낸다는 생각이 자연스럽게 듭니다. 소수(Prime Number)는 1과 자기자신만을 약수로 가지는 1보다 큰 자연수이고, 이 개념의 기본 아이디어는 가장 작은 소수부터 시작해서 그 배수를 지워나가는 방식으로 동작합니다. 1부터 n까지의 소.. 2025. 4. 22.
유클리드 호제법(Euclidean algorithm) 유클리드 호제법 (Euclidean algorithm)  이번에는 유클리드 호제법에 대해 알아보도록 하겠습니다. 먼저 유클리드 호제법이 뭔지 알아보겠습니다. 유클리드 호제법(Euclidean algorithm) 또는 유클리드 알고리즘은 두 양의 정수, 혹은 두 다항식의 최대공약수를 구하는 방법으로, 알고리즘을 공부할 때, 최대공약수(GCD, Greatest Common Divisor)와 최소공배수(LCM, Least Common Multiple)을 구하는 데 유용하게 사용되는 방식 입니다. 원리이름은 거창해보이고 복잡할 것 같지만, 그 원리를 보면 그다지 복잡하지 않습니다. "두 수의 최대공약수는, 큰 수에서 작은 수를 나눈 나머지와 작은 수의 최대공약수와 같다." 라는 원리로 접근하여 값을 도출하는 알.. 2025. 4. 13.
정렬 - 합병정렬(Merge Sort) 합병정렬(Merge Sort)오늘은 마지막으로 알아볼 정렬인 합병정렬입니다. 합병정렬 또한 이전에 살펴 본 퀵정렬과 같은 분할 정복 방식을 채택한 알고리즘으로 결과적으로는 퀵정렬과 동일한 O(nlogn)의 시간복잡도를 가집니다. 하지만 여러 상황에 따라 퀵정렬과는 차이점이 존재하니 자세히 살펴봐야 합니다.#include using namespace std;// 두 개의 정렬된 부분 배열을 병합하는 함수void merge(int arr[], int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; int* leftArr = new int[n1]; int* rightArr = new int[n2].. 2025. 4. 4.
정렬 - 퀵정렬(Quick Sort) 퀵정렬(Quick Sort) 오늘은 퀵정렬에 대해 알아보겠습니다. 퀵정렬은 "대표적인 분할정복 알고리즘으로 평균속도가 O(nlogn)" 입니다.#include #include using namespace std;// 배열을 분할하는 함수int partition(vector& arr, int low, int high) { int pivot = arr[high]; // 피벗을 마지막 요소로 설정 int i = low - 1; // 작은 요소들의 인덱스 for (int j = low; j & arr, int low, int high) { if (low arr = {10, 3, 8, 9, 1, 5}; int n = arr.size(); cout  퀵정렬은 평균적으로 수행시간이 .. 2025. 3. 26.
정렬 - 삽입정렬(Insertion Sort) 삽입정렬(Insertion Sort) 오늘은 삽입정렬에 대해 알아보겠습니다. 삽입정렬은 "각 숫자를 적절한 위치에 삽입하는 방식하는 정렬 방법" 입니다. #include #include using namespace std;// 삽입 정렬 함수void insertionSort(vector& arr) { int n = arr.size(); for (int i = 1; i = 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; // key 삽입 }}// 배열 출력 함수void printArray(const vector& arr) { for (int num :.. 2025. 2. 24.
정렬 - 버블정렬(Bubble Sort) 버블정렬(Bubble Sort) 이전에 알아본 선택정렬 다음은 버블정렬입니다. 버블 정렬을 간단하게 요약하면 "옆에 있는 값과 비교하여 더 작은 값을 반복적으로 앞으로 보내는 정렬 방법" 입니다. #include using namespace std;void bubbleSort(int arr[], int n) { for (int i = 0; i arr[j + 1]) { swap(arr[j], arr[j + 1]); } } }}void printArray(int arr[], int n) { for (int i = 0; i  위 소스코드는 C++로 짜여진 1~10까지의 숫자를 오름차순으로 정렬시키는 버블정렬입니다. 위 소스코드에서 p.. 2025. 2. 7.
정렬 - 선택정렬(Selection Sort) 선택정렬(Selection Sort) 지금부터는 다양한 종류의 알고리즘에 대해서 알아보도록 할 것입니다. 알고리즘의 종류는 매우 다양하지만 그 중에서 가장 많이 알려져있는 정렬에 대해서 차근차근 알아보겠습니다. 정렬에는 종류가 다양한데 그 중 가장 기본적인 것은 선택정렬입니다. 1~10까지의 숫자가 무작위로 있을 때 오름차순으로 정렬하는 것을 예시로 많이 사용하여 각 알고리즘의 동작과정을 살펴보는 것이 보편적입니다. 선택정렬은 "가장 작은 것을 선택하여 앞으로 보내는 방법" 입니다. #include using namespace std;int main() { int arr[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9}; int n = 10, minIndex, temp; .. 2025. 1. 31.
게임개발 중급(100) - Monster Killer(62) Monster Killer 어느새 중급을 다룬지 100번째가 되었습니다! 새삼 글을 상당히 많이 썼다고 이제서야 느껴지네요 하지만 아직 앞으로 더 보여드릴게 많습니다. 항상 봐주셔서 감사합니다. 그럼 바로 본론으로 들어가보도록 하겠습니다. UI 피드백 및 변경 사항저번에 오류수정과 UI 수정에 이어서 작성해볼까 합니다. 오늘은 받았던 UI 피드백과 그에 관련한 변경 사항입니다. UI 피드백은 대부분 축소 화면에서 깨지는 것이었고, 그 부분은 해결이 되었습니다. 이제 남은 것은 불편한 UI와 디자인 그리고 게임 플레이 가이드가 없다는 UX 관련 부분도 있었습니다. 이제 변경사항을 살펴보겠습니다. 클리어 페이지불편한 UI와 디자인에는 주로 이 클리어 페이지의 비중이 높았습니다. UI 디자인을 하기 전에는 글.. 2024. 10. 20.
게임개발 중급(96) - Monster Killer(58) Monster Killer 보스 세팅이제 마지막 컨텐츠인 보스 모드 입니다. 보스 모드는 다른 게 어려운게 아니라 10 마리의 보스를 다 특색있게 만들어야 한다는 것이 어렵습니다. 제가 유료로 에셋을 구매하여 게임을 만드는 것이라면 멋진 보스몬스터를 구하는 것은 그렇게 어렵지 않을 수도 있지만, 일단 저는 무료로 사용할 수 있는 리소스만 활용하기 때문에 쉽지 않을 것으로 보입니다. 보스 개념 정의보스를 세팅하려고 보니 한 가지 걸리는 것이 있었습니다. 바로 보스의 개념이 정립되어 있지 않았다는 것입니다. 무슨 말이냐면 이 게임의 이름은 "Monster Killer"인데 현재까지 등장하는 모든 몬스터는 '드래곤', '용'의 형태를 띄고 있습니다. 그래서 아예 드래곤으로 10마리를 전부 채울 지 아니면 딱히.. 2024. 9. 10.
게임개발 중급(95) - Monster Killer(57) Monster Killer 데이터 베이스 사용 및 연결이제 기존에 PlayerPrefs를 통해 게임 내에서만 관리하던 데이터를 데이터베이스를 통해 관리하도록 바꾸겠습니다. 사용하는 데이터베이스는 파이어베이스를 사용하게 되었습니다. GameManager가장 먼저, 데이터베이스와 연동을 시키기 위해서는 기존에 플레이어의 데이터를 관리, 사용하던 GameManager를 정리할 필요가 있습니다. GameManager는 싱글톤 인스턴스로 게임에서의 플레이어의 모든 데이터를 관장하는 역할을 하고 있으며, 데이터와 관련된 기능도 일부 담당하고 있습니다. 기존에 데이터와 관련 없는 함수가 작성되어 있다면 다른 곳으로 옮겨주고, 필요없는 내용을 걷어내는 과정을 거쳤습니다. 더 많은 데이터가 존재하지만, 일단 지금은 데이.. 2024. 9. 5.