JavaScript로 배우는 유클리드 호제법 (GCD with Euclidean Algorithm)
·
Programing/Algorithm
유클리드 호제법이란?"유클리드 호제법(Euclidean Algorithm)"은 두 자연수의 "최대공약수(Greatest Common Divisor, GCD)"를 효율적으로 구하는 고전적인 수학 알고리즘입니다. 이 방식은 기원전 유클리드가 『기하학 원론』에서 소개한 방법으로, 간단하면서도 강력한 계산 원리를 기반으로 합니다. 알고리즘 문제 풀이뿐만 아니라 실제 시스템 설계나 암호 알고리즘에서도 활용되는 등, 실무와 이론 양쪽에서 중요한 위치를 차지하고 있습니다.핵심 아이디어는 다음과 같습니다:두 수 A, B가 있을 때 (단, A > B), A를 B로 나눈 나머지를 R이라고 하면,A와 B의 최대공약수는 곧 B와 R의 최대공약수와 동일합니다.이 과정을 B가 0이 될 때까지 반복하면, 마지막에 남는 수가 GCD..
JavaScript로 이해하는 프림 알고리즘 (Prim’s Minimum Spanning Tree)
·
Programing/Algorithm
프림 알고리즘이란?"프림 알고리즘(Prim's Algorithm)"은 "최소 신장 트리(Minimum Spanning Tree)"를 찾기 위한 대표적인 방법 중 하나입니다. 이 알고리즘은 하나의 정점에서 시작해, "가장 가까운 정점"을 차례로 선택하며 트리를 확장해나가는 방식으로 동작합니다. 크루스칼 알고리즘이 "간선 중심(edge-based)"이라면, 프림은 "정점 중심(vertex-based)"이라는 점에서 구별됩니다.작동 방식 요약프림 알고리즘은 다음과 같은 단계로 작동합니다:임의의 시작 정점을 선택합니다.해당 정점과 인접한 간선 중에서 가장 가중치가 작은 간선을 선택합니다.선택된 간선으로 연결된 정점을 방문하며 트리에 포함시킵니다.방문하지 않은 정점들 중에서 트리에 연결할 수 있는 최소 비용의 간..
JavaScript로 이해하는 크루스칼 알고리즘 (Minimum Spanning Tree)
·
Programing/Algorithm
크루스칼 알고리즘이란?"크루스칼 알고리즘(Kruskal's Algorithm)"은 그래프 이론에서 "최소 신장 트리(Minimum Spanning Tree, MST)"를 찾기 위해 널리 사용되는 대표적인 "그리디 알고리즘"입니다. 최소 신장 트리는 주어진 모든 정점을 연결하면서, 간선의 전체 가중치 합이 최소가 되는 트리입니다.크루스칼 알고리즘은 모든 간선을 가중치 기준으로 정렬한 다음, 작은 가중치부터 차례대로 간선을 선택해나가되, 사이클을 만들지 않도록 관리합니다. 이 과정에서 "사이클 여부 확인"을 위해 "Union-Find(유니온-파인드)" 자료구조가 사용됩니다.핵심 절차크루스칼 알고리즘은 다음과 같은 단계를 따릅니다:간선 정렬: 그래프의 모든 간선을 가중치 기준으로 오름차순 정렬합니다.Union..
JavaScript로 이해하는 병합 정렬 (Merge Sort Algorithm)
·
Programing/Algorithm
병합 정렬이란?"병합 정렬(Merge Sort)"은 "분할 정복" 전략을 기반으로 하는 효율적인 정렬 알고리즘입니다. 이 알고리즘은 입력 배열을 더 작은 하위 배열로 재귀적으로 나눈 후, 각 하위 배열을 정렬하고, 다시 병합하면서 전체 배열을 정렬하는 방식으로 동작합니다. 특히 "병합 정렬"은 안정 정렬(stable sort)에 해당하며, 입력 배열의 원소 순서가 동일한 값일 경우에도 유지된다는 특성을 가집니다. 또한 최악의 경우에도 시간 복잡도가 일정하여 매우 안정적인 성능을 보입니다."안정 정렬"이란, 값이 같은 항목이 있을 때 원래의 입력 순서를 그대로 유지하는 정렬을 말합니다. 예를 들어 이름과 점수를 함께 정렬하는 상황에서, 점수가 같은 학생들의 이름 순서를 유지할 수 있는 정렬 방식이 안정 정..
JavaScript로 이해하는 회의실 배정 문제 (Meeting Room Scheduling)
·
Programing/Algorithm
회의실 배정 문제란?"회의실 배정 문제"는 여러 개의 회의 요청이 주어졌을 때, 겹치지 않도록 회의 일정을 구성하거나 회의실을 최소한으로 사용하여 모든 회의를 수용하는 문제입니다. 문제는 크게 두 가지 유형으로 나눌 수 있습니다:가능한 한 많은 회의를 하나의 회의실에서 진행하기모든 회의를 수용하기 위해 필요한 회의실의 최소 개수 구하기1. 그리디 방식: 하나의 회의실에 최대한 많은 회의 배정핵심 아이디어"종료 시간"을 기준으로 회의 목록을 오름차순 정렬합니다.이전 회의가 끝난 이후에 시작하는 회의만 선택하여 최대한 많은 회의를 배정합니다.JavaScript 예제 코드function scheduleMeetings(meetings) { // 종료 시간을 기준으로 정렬 (가장 빨리 끝나는 회의를 우선 선택하..
JavaScript로 해결하는 활동 선택 문제 (Activity Selection Algorithm)
·
Programing/Algorithm
활동 선택 문제란?"활동 선택 문제"는 주어진 여러 활동 중에서 겹치지 않도록 가장 많은 활동을 선택하는 문제입니다. 각 활동은 "시작 시간"과 "종료 시간"으로 정의되며, 하나의 활동이 끝난 후에만 다음 활동을 시작할 수 있다는 조건이 있습니다.이 문제는 "탐욕 알고리즘(Greedy Algorithm)"을 활용하여 빠르고 효율적으로 해결할 수 있는 대표적인 스케줄링 문제입니다.문제 정의활동은 [start, end] 형태의 쌍으로 주어짐하나의 시간대에는 하나의 활동만 가능선택된 활동은 서로 겹치지 않아야 함목표: 선택할 수 있는 활동의 최대 개수를 구함실생활 예시회의실 예약 시간표 구성작업 스케줄 최적화인터뷰 일정 조정탐욕 알고리즘의 접근 방식핵심 전략"종료 시간이 빠른 순"으로 활동을 정렬한 후, 현재..
JavaScript로 해결하는 거스름돈 문제 (Greedy Algorithm)
·
Programing/Algorithm
거스름돈 문제란?"거스름돈 문제"는 주어진 금액을 가장 적은 개수의 동전으로 만들기 위한 전략을 찾는 문제입니다. 이 문제는 "탐욕 알고리즘(Greedy Algorithm)"의 대표적인 예시로 자주 사용되며, ATM 출금, 자동결제 시스템, 화폐 자동 교환기 등 다양한 실무 분야에서도 적용됩니다.문제 정의동전 단위가 담긴 배열 coins[]와 목표 금액 amount가 주어짐목표: 동전을 조합해 총합이 amount가 되도록 하고, 사용한 동전의 개수를 최소화동전은 무한정 사용할 수 있음예: coins = [500, 100, 50, 10], amount = 1260이면 정답은 동전 6개 (500x2, 100x2, 50x1, 10x1)탐욕 알고리즘의 접근 방식핵심 전략"큰 단위 우선"의 전략을 사용합니다. 가..
JavaScript로 해결하는 0/1 배낭 문제 (Knapsack Problem)
·
Programing/Algorithm
0/1 배낭 문제란?"0/1 배낭 문제"는 주어진 아이템들 중 일부를 선택해 제한된 무게 안에서 가치를 최대로 만드는 조합을 찾는 대표적인 "동적 계획법" 문제입니다. 각 아이템은 한 번만 선택할 수 있으며, 쪼갤 수 없습니다. 이 문제는 물류 최적화, 자원 분배, 게임 인벤토리 설계 등 다양한 분야에 활용됩니다.문제 조건 요약:각 아이템은 무게(weight)와 가치(value)를 가짐아이템은 쪼갤 수 없으며, 선택하거나 선택하지 않음배낭에는 정해진 "무게 제한"이 있음선택한 아이템들의 "총 무게"는 제한을 넘을 수 없음가능한 조합 중, "가치의 합이 최대"가 되도록 선택예: 무게가 [2, 3, 4, 5], 가치가 [3, 4, 5, 6]인 아이템과 capacity = 5가 주어졌을 때, 최대 가치는 7입..
JavaScript로 해결하는 동전 교환 문제 (Coin Change Algorithm)
·
Programing/Algorithm
동전 교환 문제란?"동전 교환 문제"는 주어진 동전의 종류와 금액이 있을 때, 해당 금액을 만들기 위한 최소 동전 개수를 구하는 대표적인 "동적 계획법(DP) 문제"입니다. 이 문제는 실생활에서도 다양한 곳에서 활용됩니다. 예를 들어 자동 결제 시스템, POS 단말기, 게임 내 재화 계산 등에서 최적의 동전 개수를 계산해야 할 때 사용됩니다.문제 조건동전의 종류: 정수 배열 형태 (예: [1, 2, 5])목표 금액: 양의 정수 (예: 11)목적: 해당 금액을 만들기 위한 "최소 동전 개수" 구하기불가능한 경우에는 -1을 반환합니다.자바스크립트로 구현하는 DP 기반 풀이function coinChange(coins, amount) { // "DP 배열"을 amount + 1 크기로 초기화 (모든 값은 무..
JavaScript로 이해하는 최적 경로 탐색 (최소 비용 경로, 다익스트라 알고리즘)
·
Programing/Algorithm
최적 경로 탐색이란?"최적 경로 탐색"은 출발 지점에서 도착 지점까지 가는 여러 경로 중에서 "가장 비용이 적은 경로"를 찾는 과정을 의미합니다. 이때의 비용은 거리, 시간, 금액 등 다양한 기준이 될 수 있습니다. 실생활에서는 다음과 같은 곳에서 활용됩니다:지도 앱: 최단 거리나 최소 소요 시간 경로 탐색네트워크 라우팅: 패킷이 지나가는 효율적인 경로 계산게임 개발: AI 캐릭터가 장애물을 피해 목표 지점까지 이동하는 경로이러한 문제들은 그래프 이론의 한 부분이며, 여러 알고리즘 중 "다익스트라 알고리즘(Dijkstra's Algorithm)"이 가장 널리 쓰입니다.다익스트라 알고리즘 개념 이해"다익스트라 알고리즘"은 가중치가 있는 그래프에서 한 정점으로부터 다른 모든 정점까지의 최소 비용 경로를 계산..