너비 우선 탐색 (BFS: Breadth-First Search) 설명과 JavaScript 예제
·
Programing/Algorithm
너비 우선 탐색(BFS)은 그래프나 트리 구조에서 루트 노드 또는 시작 지점으로부터 가까운 노드부터 차례대로 탐색해 나가는 방식의 탐색 알고리즘입니다. 탐색이란 주어진 조건에 맞는 노드를 찾거나 모든 노드를 방문하는 과정을 의미하며, BFS는 이 중에서도 최단 경로를 찾는 데 효과적입니다. 일반적으로 큐(Queue) 자료구조를 이용해 구현되며, 알고리즘 문제 풀이뿐 아니라 실무에서도 널리 사용됩니다.BFS는 특히 그래프의 연결성 확인, 최단 거리 계산, 최소 단계로의 전파 시뮬레이션 등 다양한 문제에서 활용됩니다. 깊이 우선 탐색(DFS)과 달리, 깊게 들어가기보다는 인접 노드를 우선 탐색한 뒤 그다음 깊이로 나아가는 것이 특징입니다.1. 동작 원리시작 노드를 큐에 넣고 방문 처리큐에서 노드를 하나 꺼냄..
깊이 우선 탐색 (DFS: Depth-First Search) 설명과 JavaScript 예제
·
Programing/Algorithm
깊이 우선 탐색(DFS)은 그래프나 트리 구조에서 가능한 한 깊이 내려간 뒤, 더 이상 갈 수 없으면 되돌아가는 방식의 탐색 알고리즘입니다. 재귀(Recursive) 또는 스택(Stack)을 사용해 구현할 수 있으며, 경로 탐색, 백트래킹 등 다양한 문제 해결에 활용됩니다.1. 동작 원리시작 노드에서 방문 처리 후 인접 노드를 탐색방문하지 않은 인접 노드가 있다면 그 노드로 이동더 이상 방문할 곳이 없다면 이전 단계로 되돌아감 (백트래킹)모든 노드를 방문할 때까지 반복2. DFS의 구현 방식재귀 기반 DFS: 함수 호출 스택을 이용하여 구현반복문 + 명시적 스택 사용: 스택 구조를 코드로 직접 구성3. JavaScript 예제 (재귀 기반)function dfsRecursive(graph, start, ..
이진 탐색 (Binary Search) 설명과 JavaScript 예제
·
Programing/Algorithm
이진 탐색(Binary Search)은 정렬된 배열에서 중간값을 기준으로 탐색 범위를 절반으로 줄여가며 원하는 값을 찾는 고속 탐색 알고리즘입니다. 정렬된 데이터에 한해 사용할 수 있지만, 시간 복잡도가 O(log n)으로 매우 뛰어난 성능을 자랑합니다.1. 동작 원리배열의 중간값을 구함중간값과 찾는 값을 비교같으면 인덱스 반환작으면 오른쪽 절반 탐색크면 왼쪽 절반 탐색탐색 범위를 좁혀가며 반복찾지 못하면 -1 반환2. JavaScript 예제function binarySearch(arr, target) { let left = 0; let right = arr.length - 1; while (left Math.floor()를 사용해 중간 인덱스를 계산반복문 안에서 좌우 범위를 줄여가며 탐색3. 성..
선형 탐색 (Linear Search) 설명과 JavaScript 예제
·
Programing/Algorithm
선형 탐색(Linear Search)은 가장 간단한 검색 알고리즘으로, 배열의 앞에서부터 순차적으로 값을 비교해 원하는 값을 찾는 방식입니다. 구현이 매우 쉬우며, 정렬 여부와 상관없이 사용할 수 있다는 장점이 있습니다.1. 동작 원리배열의 첫 번째 요소부터 마지막 요소까지 반복현재 요소가 찾고자 하는 값과 같으면 인덱스를 반환끝까지 찾아도 없다면 -1을 반환2. JavaScript 예제function linearSearch(arr, target) { for (let i = 0; i === 연산자를 사용하여 값과 타입을 모두 비교가장 먼저 일치하는 값의 인덱스를 반환함3. 성능 분석구분시간 복잡도최선의 경우O(1)평균O(n)최악의 경우O(n)입력이 많아질수록 속도가 느려짐공간 복잡도는 O(1)4. 선형..
기수 정렬 (Radix Sort) 설명과 JavaScript 예제
·
Programing/javascript
기수 정렬(Radix Sort)은 자릿수를 기준으로 정렬하는 비교 기반이 아닌 정렬 알고리즘입니다. LSD(Least Significant Digit) 방식과 MSD(Most Significant Digit) 방식이 있으며, 일반적으로 자릿수 낮은 곳부터 정렬하는 LSD 방식이 많이 사용됩니다. 정수가 많고 자릿수가 제한된 경우 매우 빠른 성능을 발휘합니다.1. 동작 원리 (LSD 방식 기준)모든 숫자의 1의 자리부터 시작해 자릿수별로 정렬10개의 큐(0~9)를 만들어 해당 자릿수의 숫자에 따라 분배자릿수를 한 칸씩 올려가며 반복가장 높은 자릿수까지 정렬하면 전체가 정렬됨→ 내부적으로는 안정 정렬이 반복되어 수행됩니다.2. JavaScript 예제 - 오름차순 정렬function getDigit(num,..
계수 정렬 (Counting Sort) 설명과 JavaScript 예제
·
Programing/Algorithm
계수 정렬(Counting Sort)은 비교 기반이 아닌 값의 개수를 세는 방식으로 정렬하는 특수한 알고리즘입니다. 숫자의 범위가 제한적이고 정수가 많은 경우 매우 빠른 성능을 발휘합니다. 다만, 일반적인 정렬 알고리즘과 달리 객체 정렬이나 실수 정렬에는 적합하지 않습니다.1. 동작 원리입력 배열에서 최대값을 찾는다0부터 최대값까지를 인덱스로 하는 카운트 배열(count array)을 생성입력 배열의 각 요소가 몇 번 나왔는지 카운트카운트 배열을 누적합 형태로 변환 (위치 정보로 사용)원래 배열을 뒤에서부터 순회하며, 결과 배열에 값을 채움→ 정렬된 결과가 새로운 배열로 만들어지는 방식입니다.2. JavaScript 예제 - 오름차순 정렬function countingSort(arr) { if (arr..
힙 정렬 (Heap Sort) 설명과 JavaScript 예제
·
Programing/javascript
힙 정렬은 완전 이진 트리의 일종인 '힙(Heap)' 자료구조를 활용한 정렬 알고리즘입니다. 선택 정렬과 유사하지만, 최대값 또는 최소값을 효율적으로 선택하기 위해 힙 구조를 사용합니다. 시간 복잡도가 항상 O(n log n)으로 일정하며, 추가 메모리 없이 정렬할 수 있는 장점이 있습니다.1. 힙의 개념최대 힙 (Max Heap): 부모 노드가 자식 노드보다 크거나 같음최소 힙 (Min Heap): 부모 노드가 자식 노드보다 작거나 같음힙 정렬에서는 일반적으로 최대 힙을 사용하여 가장 큰 값을 루트로 올리고 배열의 뒤로 보냅니다.2. 동작 원리배열을 최대 힙 구조로 변환 (build max heap)힙의 루트(최대값)를 배열 끝으로 보냄힙 크기를 줄이고 다시 heapify 수행위 과정을 반복하여 정렬 ..
퀵 정렬 (Quick Sort) 설명과 JavaScript 예제
·
Programing/Algorithm
퀵 정렬은 분할 정복(Divide and Conquer) 전략을 사용하는 매우 빠른 정렬 알고리즘입니다. 평균 시간 복잡도가 O(n log n)으로 빠르며, 실제 애플리케이션에서도 널리 사용됩니다. 핵심 아이디어는 피벗(pivot)을 기준으로 작은 값과 큰 값을 분할하고 재귀적으로 정렬하는 것입니다.1. 동작 원리배열에서 피벗 값을 하나 선택피벗보다 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할분할된 배열을 재귀적으로 퀵 정렬 수행정렬된 왼쪽 + 피벗 + 정렬된 오른쪽을 합쳐 최종 정렬2. JavaScript 예제 - 오름차순 정렬function quickSort(arr) { if (arr.length pivot: 기준값 (예제에선 마지막 요소)left: pivot보다 작은 값 저장right: pivot보..
병합 정렬 (Merge Sort) 설명과 JavaScript 예제
·
Programing/Algorithm
병합 정렬은 대표적인 분할 정복(Divide and Conquer) 알고리즘으로, 배열을 절반으로 나누고 각각 정렬한 후 다시 병합하여 정렬을 완성하는 방식입니다. 시간 복잡도가 항상 일정(O(n log n))하기 때문에 안정적이며, 정렬 성능이 중요한 경우 많이 사용됩니다.1. 동작 원리배열을 반으로 나눔 (재귀적으로 반복)더 이상 나눌 수 없을 때까지 분할두 개의 정렬된 배열을 병합하면서 하나의 정렬된 배열로 만듬이러한 구조는 재귀 호출과 정렬된 병합이 핵심입니다.2. JavaScript 예제 - 오름차순 정렬function mergeSort(arr) { if (arr.length 배열을 계속 반으로 나눈 뒤, merge() 함수로 정렬 병합병합 과정은 항상 두 배열이 정렬되어 있다는 가정 하에 수..
삽입 정렬 (Insertion Sort) 설명과 JavaScript 예제
·
Programing/Algorithm
삽입 정렬은 정렬이 되어 있는 부분에 데이터를 삽입하는 방식으로 동작하는 정렬 알고리즘입니다. 카드 게임에서 손에 카드를 한 장씩 끼워 넣으며 정렬하는 방식과 유사해 직관적으로 이해하기 쉽습니다.1. 동작 원리두 번째 요소부터 시작해서 현재 값을 임시 변수로 저장그 앞에 있는 요소들과 비교해, 자신보다 큰 값은 한 칸씩 뒤로 이동적절한 위치에 임시 값을 삽입배열의 끝까지 반복정렬된 부분을 점차 확장해나가는 구조입니다.2. JavaScript 예제 - 오름차순 정렬function insertionSort(arr) { for (let i = 1; i = 0 && arr[j] > current) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = curr..