no image
Queue?
Queue? Queue는 줄을 서다라는 뜻으로 큐에 먼저 들어간 데이터가 먼저 나오는 자료 구조입니다. 스택과 마찬가지로 예를 들어보면 맛집에서 줄을 선 순서대로 입장하는 것과 똑같습니다. 이런 큐의 특징을 선입선출 또는 FIFO라고 하며 큐에서 삽입하는 연산을 Enqueue, 꺼내는 연산을 Dequeue라고 합니다. 큐의 특징 Enqueue 큐에 데이터를 추가하는 작업이며 새로운 데이터는 항상 큐의 끝에 추가됩니다. // 큐에 데이터를 추가하는 메서드 public void enqueue(E item) { // 만약 큐의 용량이 가득 찬 경우 예외 처리를 할 수도 있습니다. if (isFull()) { System.out.println("Queue is full. Cannot enqueue."); ret..
2024.04.12
no image
수식 표기법
수식 표기법 수식을 표현하는 방법으로 중위, 전위, 후위법이 널리 사용됩니다. 이러한 표기법들은 계산기를 포함한 컴퓨터 프로그램에서 수식을 표현하고 계산하는 데 사용됩니다. 각각의 표기법은 스택을 사용하여 계산을 수행할 때 유용합니다. 수식 표기법을 사용하는 이유는 연산자의 우선순위를 명확하게 할 수 있고, 복잡한 수식을 간단하고 명료하게 표현하기 위함입니다. 특히 전위나 후위 표기법을 사용하면 괄호를 사용하지 않아도 연산자의 우선순위를 명확히 파악할 수 있습니다. 중위 전위 후위 1+3*5 +1*35 135*+ a*b+8 +8*ab ab*8+ (2+2)+9 +9+22 22+9+ 전위 표기법 수식에서 연산자가 피연산자 앞에 위치하는 표기법이며 이 표기법에는 연산자가 피연산자들의 앞에 오기 때문에 피연산자..
2024.02.26
no image
탐욕법
Greedy Algorithm🏋 탐욕 알고리즘은 말 그래도 탐욕스러운 이라는 의미를 가지며 , 선택의 순간이 오면 눈앞에 보이는 최적의 상황만을 고려하여 최종적인 해답에 도달하는 방법을 말합니다. 이 알고리즘은 각 선택의 순가에는 최적으로 보일 수 있지만, 그 선택이 전체적으로 보았을 때 최적인지는 보장되지 않을 수 있습니다. Greedy Algorithm 불가능한 경우 1. 현재 상황에서는 마시멜로 1개를 받을 수 있습니다.(현재 시점에서의 최선의 선택) 2. 그러나 5분을 기다리면 2개의 마시멜로를 받을 수 있습니다. (미래를 고려한 선택) 그리디 알고리즘에 따르면 각 단계에서 현재 최선으로 보이는 선택을 하기 때문에 현재 시점에서 1개의 마시멜로를 받는 것이 선택될 것입니다. 그러나 미래를 고려할 ..
2024.02.22
no image
해시법
배열 배열 A에서 새로운 값인 36을 추가하게 되며 삽입할 위치가 a[5]와 a[6] 사이의 이진 검색법으로 조사하고 B의 이미지처럼 a[6]이후의 모든 요소를 하나씩 뒤로 이동하게 됩니다. 요소가 이동할 때 필요한 복잡도는 O(n)이므로 비용은 작다고 할 수 없습니다. 삭제 같은 경우도 똑같은 비용이 들어갑니다. 해시법 해시법은 데이터를 효율적으로 저장하고 검색하기 위한 기법으로, 간단한 연산을 통해 데이터의 저장 위치를 결정하는 방식입니다. 일반적으로는 해시 함수를 사용하여 데이터의 키를 해시값으로 변환 후 이 해시값을 이용하여 데이터를 저장하거나 검색합니다. 위와 같이 해시값을 index로 하여 key값과 data를 저장하는 자료구조를 해시 테이블이라고 합니다. 이 해시 테이블은 해시값을 인덱스로 ..
2024.02.20
no image
기수 정렬
기수 정렬 비교를 통해 정렬하는 대부분의 알고리즘과는 다르게 숫자를 자릿수 별로 비교하며 정렬하는 비교하며 정렬하는 비교 정렬이 아닌 정렬 알고리즘 입니다. 이 알고리즘은 각 숫자의 자릿수를 기준으로 정렬하며, 작은 단게부터 시작하여 큰 단계까지 반복적으로 수행합니다. 또한 일반적으로 가장 낮은 자리수부터 시작하여 가장 높은 자리수까지 정렬합니다. 각 자릿수를 기준으로 숫자를 정렬하는 과정에서 카운팅 정렬이 사용될 수 있습니다. 각 숫자의 1의 자리를 기준으로 정렬하고 10의 자리를 기준으로 추가적으로 정렬합니다. 이 때 10의 자리 숫자가 같을 때는 1의 자리 숫자가 작은 순서로 배치합니다. 중복된 숫자가 있다면, 정렬된 후에도 중복된 순서가 입력 순서와 같다면 안정적이다. 또한 안정적인 정렬 알고리즘..
2024.01.04
no image
힙 정렬
Heap Sort 이진 합 자료구조를 기반으로 한 정렬 알고리즘입니다. 이 알고리즘은 힙을 사용하여 정렬을 수행하는데, 힙은 부모 노드와 자식 노드 간의 관계를 이용하여 데이터를 정렬합니다. 특징 비교적 불안정한 정렬 방법 중 하나입니다. 동일한 값에 대해 상대적 순서가 바뀔 수 있다. 비교 기반의 정렬 알고리즘으로, 데이터 간의 비교를 기반으로 정렬을 수행합니다. 평균 및 최악의 시간 복접도는 O(n log n)입니다. 이는 효율적인 정렬 알고리즘 중 하나입니다. 분할 정복 방법을 사용하며 배열을 힙으로 구성하고 최대 힙에서 최댓값을 반복적으로 추출하여 정렬을 완성합니다. 과정 최대 힙 구성 먼저 주어진 배열을 최대 힙으로 만듭니다. 최대 힙이란 부모 노드가 항상 자식 노드보다 크거나 같은 트리 구조입..
2023.12.15
no image
병합정렬
병합정렬 병합 정렬은 분할 정복 알고리즘의 일종으로 배열을 반으로 나눈 후 각 부분에서 재귀적으로 정렬을 수행하는 알고리즘입니다. 여러 번 반복하여 배열이 충분히 작아질 때까지 이 작업을 진행한 후, 병합 정렬을 사용하여 두 부분을 합치면서 정렬을 완성합니다. 병합 정렬과 분할 정렬의 관계 분할정렬 배열을 반으로 나누어 각 부분에서 재귀적으로 정렬을 수행합니다. 배열이 충분히 작아 더 이상 나눌 수 없을 때까지 이 과정을 반복합니다. 병합정렬 정렬된 두 개의 한위 배열을 하나로 합칩니다. 정렬된 하위 배열을 합치는 과정에서 정렬 순서를 유지하며, 작은 값을 순서대로 새로운 배열에 병합합니다. 병합 정렬 동작 과정 분할 주어진 배열을 반으로 나눕니다. 배열의 중간 지점을 찾고, 왼쪽과 오른쪽으로 나눕니다...
2023.12.14
no image
퀵 정렬
퀵 정렬 레코드의 자료 이동을 최소화하며 배열을 정렬하는 퀵 정렬은 선택한 피벗을 중심으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할하여 정렬하는 방식입니다. 피벗을 정하고, 작은 값은 피벗 왼쪽으로, 큰 값은 오른쪽으로 이동시키는 과정을 반복하며 서브 파일을 만들어 나가며 정렬합니다. 이 재귀적 분할 정복 과정을 통해 전체 배열을 정렬합니다. 정렬 과정 정복 분할된 부분 배열에 대해 재귀적으로 퀵 정렬을 수행합니다. 이는 각 부분 배열에 대해 위의 과정을 반복하는 것을 의미합니다. 각 부분배열은 피벗을 기준으로 다시 분할되고 정렬됩니다. public void quickSort(int[] array, int left, int right) { if(left >= right) return; // 분할 int..
2023.12.11
no image
삽입정렬
Insertion Sort 삽입 정렬은 가장 간단한 정렬 방식이며 이미 순화된 파일에 새로운 하나의 레코드를 순서에 맞게 삽입시켜 정렬합니다. 정렬 과정 배열의 첫 번째 요소는 이미 정렬된 부분으로 간주합니다. 두 번째 요소부터 시작하여 배열의 끝까지 순회합니다. 각 요소마다 현재 요소를 key에 저장하고, 이전 위치의 요소들과 비교하며 적절한 위치를 찾게 됩니다. key보다 큰 요소들을 오른쪽으로 한 칸씩 이동시키면서 삽입할 위치를 찾게 됩니다. key를 적절한 위치에 삽이하여 정렬된 부분을 확장 시킵니다. 삽입 정렬 코드 public class InsertionSort { public static void insertionSort(int[] arr) { int n = arr.length; for (i..
2023.12.08