너비 우선 탐색 (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. 선형..
계수 정렬 (Counting Sort) 설명과 JavaScript 예제
·
Programing/Algorithm
계수 정렬(Counting Sort)은 비교 기반이 아닌 값의 개수를 세는 방식으로 정렬하는 특수한 알고리즘입니다. 숫자의 범위가 제한적이고 정수가 많은 경우 매우 빠른 성능을 발휘합니다. 다만, 일반적인 정렬 알고리즘과 달리 객체 정렬이나 실수 정렬에는 적합하지 않습니다.1. 동작 원리입력 배열에서 최대값을 찾는다0부터 최대값까지를 인덱스로 하는 카운트 배열(count array)을 생성입력 배열의 각 요소가 몇 번 나왔는지 카운트카운트 배열을 누적합 형태로 변환 (위치 정보로 사용)원래 배열을 뒤에서부터 순회하며, 결과 배열에 값을 채움→ 정렬된 결과가 새로운 배열로 만들어지는 방식입니다.2. JavaScript 예제 - 오름차순 정렬function countingSort(arr) { if (arr..
퀵 정렬 (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..
선택 정렬 (Selection Sort) 설명과 JavaScript 예제
·
Programing/Algorithm
선택 정렬은 배열에서 가장 작은 값을 찾아 앞쪽으로 하나씩 정렬해 나가는 단순한 방식의 정렬 알고리즘입니다. 구현이 쉽고 직관적이지만, 성능 면에서는 비효율적이기 때문에 실제 애플리케이션보다는 교육용으로 자주 사용됩니다.1. 동작 원리배열의 첫 번째 요소부터 시작남은 요소 중 가장 작은 값을 찾아 현재 위치와 교환인덱스를 한 칸 뒤로 옮기고 같은 작업 반복배열의 끝까지 반복하면 정렬 완료정리하면, "가장 작은 값을 선택해서 앞으로 보낸다"는 의미에서 선택 정렬이라 불립니다.2. JavaScript 예제 - 오름차순 정렬function selectionSort(arr) { const len = arr.length; for (let i = 0; i minIndex: 현재 가장 작은 값의 인덱스를 저장ES..
버블 정렬 (Bubble Sort) 설명과 JavaScript 예제
·
Programing/Algorithm
버블 정렬은 가장 간단하고 직관적인 정렬 알고리즘 중 하나입니다. 인접한 두 요소를 비교하여 크기 순서가 맞지 않으면 자리를 바꾸는 방식으로 정렬을 수행합니다. 데이터가 거의 정렬되어 있을 경우에는 빠르게 동작하지만, 대부분의 경우 성능이 떨어져 실제 사용보다는 교육용으로 자주 활용됩니다.1. 동작 원리버블 정렬은 다음 과정을 반복합니다:배열의 처음부터 끝까지 인접한 두 요소를 비교앞의 값이 뒤의 값보다 크면 두 값을 교환위 과정을 배열의 끝까지 반복한 번 순회가 끝날 때마다 가장 큰 값이 맨 뒤로 '버블처럼' 올라감이를 전체 길이 - 1 만큼 반복하면 정렬이 완료됩니다.2. JavaScript 예제 - 오름차순 정렬function bubbleSort(arr) { const len = arr.lengt..