본문 바로가기

Data structure & Algorithms study

(32)
다익스트라 알고리즘 (Dijkstra's Algorithm) 다익스트라 알고리즘(Dijkstra's Algorithm)은 그래프에서 한 정점에서 다른 모든 정점까지의 최단 경로를 찾는 알고리즘이다. 이 알고리즘은 주로 양의 가중치를 가진 그래프에서 사용되며, 그래프가 음의 가중치를 가진 경우에는 사용할 수 없다.다익스트라 알고리즘은 그리디 알고리즘(Greedy Algorithm)의 한 종류로, 각 단계에서 가장 비용이 적은 경로를 선택하면서, 그 경로를 확장하는 방식으로 진행된다.다익스트라 알고리즘의 동작 원리다익스트라 알고리즘의 핵심 아이디어는 각 노드에 대해 최단 경로를 점차적으로 확장해 나가는 것이다. 출발 노드에서 시작해 다른 모든 노드로 가는 최단 경로를 찾는 과정에서, 매번 가장 비용이 적은 노드를 선택해 최단 경로를 확정짓는다. 각 단계에서 방문하지 ..
백트래킹_순열 생성 (Permutation Generation) 순열(Permutation)은 주어진 원소들의 순서를 고려한 배열이다. 즉, 주어진 원소들의 모든 가능한 순서의 경우를 나열하는 것이 순열 생성이다. 주어진 원소가 n개라면, 순열의 개수는 n! (팩토리얼)개가 된다.예시:주어진 원소가 [1, 2, 3]일 때, 가능한 모든 순열은 다음과 같다:[1, 2, 3][1, 3, 2][2, 1, 3][2, 3, 1][3, 1, 2][3, 2, 1] 순열 생성의 특징순열은 원소들의 순서를 바꾸어 다양한 조합을 만들기 때문에, 원소들의 순서가 매우 중요하다. 따라서 순열 생성 문제에서는 모든 원소를 한 번씩 사용하여 가능한 모든 경우를 나열하는 방식으로 접근해야 한다. 백트래킹을 이용한 순열 생성백트래킹을 사용한 순열 생성은 각 단계에서 아직 사용하지 않은 원소를 선..
백트래킹_부분 집합 생성 (Subset Generation) 부분 집합 생성(Subset Generation)은 주어진 집합의 모든 부분 집합을 구하는 문제이다. 부분 집합(Subset) 생성의 개념주어진 집합이 있을 때, 그 집합의 부분 집합이란 주어진 원소들 중 일부 또는 전체를 선택한 새로운 집합을 말한다. 부분 집합에는 빈 집합과 전체 집합도 포함된다. 주어진 집합에 포함된 원소의 개수가 n개라면, 그 집합의 부분 집합의 개수는 2^n개이다. 이는 각 원소를 선택하거나 선택하지 않음으로써 발생하는 모든 경우의 수이다.예시주어진 집합이 {1, 2, 3}이라고 할 때, 부분 집합은 다음과 같다:[][1][2][3][1, 2][1, 3][2, 3][1, 2, 3]백트래킹을 사용한 부분 집합 생성백트래킹(Backtracking)은 모든 가능한 선택을 시도하면서, ..
백트래킹 (Backtracking)_N-Queen 백트래킹(Backtracking)은 해를 찾기 위해 탐색 공간을 체계적으로 탐험하는 알고리즘 기법이다. 문제를 해결할 때 가능한 모든 경우의 수를 고려하지만, 불필요한 탐색을 줄이기 위해 잘못된 경로를 빨리 차단하고 다시 이전 상태로 돌아가는(백트래킹하는) 방식으로 동작한다.백트래킹은 주로 재귀적인 방식으로 구현되며, 해를 찾기 위해 완전 탐색을 수행하되, 탐색 중 조건을 만족하지 않는 경로는 더 이상 탐색하지 않고 빠르게 포기하여 효율성을 높인다. 백트래킹의 핵심 개념후보해 생성(Partial Solution):문제를 해결하는 과정에서, 해결 가능한 해의 일부를 먼저 만들어 본다. 이때, 해가 아직 완성되지 않았을 수 있다.유망성 검사(Pruning):현재까지 만든 해가 유효한지(해를 구할 가능성이 있..
최대 부분 배열 합 (Maximum Subarray Sum) 최대 부분 배열 합(Maximum Subarray Sum) 문제는 주어진 배열에서 연속된 부분 배열 중에서 가장 큰 합을 갖는 부분 배열을 찾는 문제이다. 이 문제는 배열에서 연속된 요소들의 합을 최대화하는 부분 배열을 찾는 것이 목표이다.문제 정의주어진 배열에서 연속된 부분 배열의 합이 최대가 되는 부분 배열을 찾는다.배열의 원소는 양수와 음수 모두 포함될 수 있다.예를 들어, 배열 [-2, 1, -3, 4, -1, 2, 1, -5, 4]가 주어진다면, 최대 부분 배열 합은 6이며, 그 부분 배열은 [4, -1, 2, 1]입니다. 카데인 알고리즘 (Kadane's Algorithm)이 문제는 카데인 알고리즘(Kadane’s Algorithm)을 사용하여 O(n)의 시간 복잡도로 해결할 수 있다. 카데인..
최장 공통 부분 수열 (Longest Common Subsequence, LCS) 최장 공통 부분 수열 (LCS) 문제는 두 개의 문자열이 주어졌을 때, 두 문자열에서 순서를 유지하며 공통으로 나타나는 가장 긴 부분 수열을 찾는 문제이다. 부분 수열(subsequence)은 원래 문자열에서 순서를 유지하면서 일부 문자를 선택하여 만든 새로운 문자열이며, 문자가 반드시 연속할 필요는 없다.예시두 문자열 A = "ABCBDAB"와 B = "BDCAB"가 주어졌을 때:A에서 "BCAB"가 B에서의 "BCAB"와 일치한다.이때 최장 공통 부분 수열은 "BCAB"이며, 그 길이는 4이다.LCS 문제의 이론적 배경LCS 문제는 다음과 같은 특성을 가지고 있다:최적 부분 구조 (Optimal Substructure):문제의 최적 해가 그 하위 문제의 최적 해로 구성될 수 있는 성질이다. 즉, 두 ..
0-1 배낭 문제 (0-1 Knapsack Problem) 0-1 배낭 문제는 NP-완전 문제 중 하나로, 주어진 아이템 중에서 최대 가치를 얻을 수 있도록 배낭에 담는 방법을 찾는 문제이다. 각각의 아이템은 특정한 무게와 가치가 있으며, 배낭은 최대 무게 제한이 있다. 아이템을 쪼갤 수 없기 때문에, 각 아이템을 넣거나 넣지 않는 선택을 해야 하며(즉, 0 또는 1로 선택), 이를 최적화하는 방식이다.문제 정의:N개의 아이템이 있고, 각 아이템은 무게 weights[i]와 가치 values[i]를 가진다.배낭의 용량 W는 한정되어 있으며, 이보다 무게가 큰 아이템들은 넣을 수 없다.목표는 배낭에 담을 수 있는 최대 가치를 구하는 것이다.예시:아이템이 다음과 같다고 가정해 본다:아이템 1: 무게 2, 가치 3아이템 2: 무게 3, 가치 4아이템 3: 무게 4, ..
동적 프로그래밍 (Dynamic Programming, DP) 동적 프로그래밍(DP)은 복잡한 문제를 작은 하위 문제로 분할하여 해결하고, 그 결과를 재사용함으로써 효율적으로 문제를 해결하는 알고리즘 기법이다. 기본적으로 동일한 문제를 여러 번 풀지 않도록 중복된 계산을 줄이는 데 중점을 둔다.동적 프로그래밍은 최적화 문제에 많이 사용되며, 특히 최소값, 최대값 또는 경로 탐색과 같은 문제에서 자주 등장한다. DP는 하위 문제의 결과를 저장(Memoization 또는 Tabulation)해두고, 이를 기반으로 더 큰 문제를 해결하는 방식으로 진행된다.DP 문제를 해결하는 핵심 개념중복되는 하위 문제 (Overlapping Subproblems):문제를 재귀적으로 해결할 때, 동일한 하위 문제를 여러 번 해결하는 경우가 많다. 동적 프로그래밍은 이러한 하위 문제의 결..

728x90