본문 바로가기

전체 글

(90)
탐욕 알고리즘(Greedy - 그리디) 1. 탐욕 알고리즘(Greedy - 그리디) 그리디 알고리즘은 매번 항상 최적의 답안을 선택하여 적절한 해를 구해내는 알고리즘입니다. 탐욕 알고리즘은 과정이 직관적이기 때문에 일반적으로 시간 복잡도가 낮고, 구현이 단순하여 빠르게 동작합니다. 이때문에  이해하기 쉽고 구현하기 간단합니다. 하지만 그리디 알고리즘이 항상 최적해를 보장하지 않는 경우가 많습니다.2. 탐욕 알고리즘의 특성(1) 탐욕적인 선택조건(Greedy Choice Property) : 각 단계에서 내리는 최적의 선택이 결국 전체 문제에 대한 최적해로 이어질 수 있어야 합니다. (2) 최적 부분 구조(Optimal property) : 문제의 최적해가 부분 문제들의 최적해로 구성될 수 있어야 합니다. 3. 동전 문제를 통한 탐욕 알고리즘의..
이진 탐색(Binary Search) 이진 탐색(Binary Search)은 정렬된 배열에서 원하는 값을 효율적으로 찾는 알고리즘입니다. 배열의 중간 요소와 목표 값을 비교하여, 목표 값이 더 작으면 왼쪽 절반, 더 크면 오른쪽 절반을 선택하여 검색을 반복합니다. 최악의 경우 시간 복잡도는 O(log⁡n)입니다.「이진 탐색의 동작 과정」1. 분할 과정 (Divide)우선 알아야할점은 배열은 항상 정렬 되어있어야 한다는 것입니다. 첫번째 분할과정에서는 현재 배열의 중간 원소를 선택합니다. 그 후 중간 원소와 찾고자 하는 값을 비교합니다.-IF 찾고자 하는 값이 중간 요소보다 작으면 : 배열에서 중간 원소의 왼쪽 절반을 선택합니다.-IF 찾고자 하는 값이 중간 요소보다 크면 : 배열에서 중간 원소의 오른쪽 절반을 선택합니다.12345 위 배열에..
퀵 정렬(Quick Sort) 퀵 정렬(Quick Sort)은 분할 정복 알고리즘의 일종으로, 배열을 임의의 기준으로 두 부분으로 나눈 후 각각을 재귀적으로 정렬하는 방식입니다. 평균 시간 복잡도는 O(nlog⁡n)이며, 최악의 경우 O(n ² )이 될 수 있습니다. 일반적으로 빠른 수행 속도로 널리 사용되는 정렬입니다.「퀵 정렬의 동작 과정」1. 분할 과정 (Divide) 퀵 정렬의 첫번째 단계에서는 "피벗(pivot)"을 정해 이를 통해 구간을 나누는 과정입니. 피벗은 일반적으로 배열의 첫 번째 원소, 마지막 원소, 또는 중앙값을 선택합니다. 피벗을 정한뒤, 배열의 원소들을 피벗을 기준으로 두 부분으로 나눕니다. 피벗보다 작은 원소들은 피벗의 왼쪽에, 피벗보다 큰 원소들은 피벗의 오른쪽에 위치하도록 합니다. -처음 주어진 배열[3..
병합(합병) 정렬(Merge Sort) 병합정렬(Merge-sort)은 퀵 정렬(Quick Sort)와 같이 분할정복 알고리즘을 이용한 정렬 알고리즘중 하나입니다. 선택정렬같은 O(N²)의 느린 정렬 알고리즘과 다르게 병합정렬은 시간복잡도 O(NlogN)의 빠른 정렬 알고리즘입니다.「병합 정렬의 동작 과정」1. 분할 과정 (Divide)  병합정렬의 첫 번째 단계인 분할과정에서는 배열을 가능한 한 작게 나눕니다. 이 단계에서는 배열을 중간을 기준으로 두 개의 하위 배열로 분할합니다. 이 과정을 배열에 원소가 하나가 될때까지 계속 반복하면 됩니다. -처음 주어진 배열 ↓ [38, 27, 43, 3, 9, 82, 10] -첫번째 분할 ↓ [38, 27, 43], [3, 9, 82, 10] -두번째 분할  [38, 27], [43],  [3, 9]..
분할 정복(Divide and conquer) 알고리즘 1. 분할정복 알고리즘 분할정복(Divide and Conquer) 알고리즘은 여러알고리즘의 기본이 되는 방법중 하나로 복잡한 문제를 더 단순하고 작은 문제로 나누어 해결하는 방식으로 이루어집니다. 잘 알려진 예로는 병합 정렬(Merge Sort)과 퀵 정렬(Quick Sort)등이 있습니다.  2. 분할 정복 알고리즘의 과정 분할정복 알고리즘의 설계 과정은 세 단계로 이루어집니다. 이 각각의 과정은 분할(Divide), 정복(Conquer), 결합(Combine)이라고부릅니다. 1. 분할(Divide): 해결하려는 문제를 더 작은 하위 문제로 나누는 과정. 2. 정복(Conquer): 나눈 하위 문제를 재귀적으로 해결. 단, 하위 문제를 더이상 분할할 수 없다면 직접 해결. 3. 결합(Combine):..
2024-04-18 -queuestack(24511, 백준) 해당 자료형에서 stack에 해당하는 부분은 움직이지 않는다. 즉 queue에 해당하는 부분들의 수만 이용해서 queue를 사용하여, 계산하면 풀린다. 더보기 #include #include #include using namespace std; int n, m; int arr[100010]; queue q; vector vc; int main() { int i, j; scanf("%d", &n); for (i = 1; i = 2) { int sum = 0, mx = -2e9, mn = 2e9; for (i = 0; i < ans.size(); i++) { //printf("%d ", ans[i]); sum += ans[i]; mx = max(mx, ans[i]);..
2024-04-01 오늘은 만우절! -수들의 합 2(2003, 백준) 쉬운 2포인터 문제라고 생각했다. 시작점에 low, high를 잡아주고, m을 기준으로 투포인터를 돌리면 풀리는 간단한 문제이다. 풀고보니 O(N^2)도 돌아간다고 한다. 더보기 #include #include #include using namespace std; int n, m; vector vec; int ans; int main() { int i, j; scanf("%d %d", &n, &m); for (i = 0; i < n; i++) { int x; scanf("%d", &x); vec.push_back(x); }vec.push_back(0); int low = 0, high = 0; int res = vec[0]; while (low < n &..
2024-03-31 주말동안 푼 문제중 어려웠던 문제 간단 리뷰 작성. -오민식의 고민 (1219, 백준) 문제에서 버는 돈은 최대화해야 한다는 것은 사용하는 비용을 최소화해야된다는 말과 같다. 즉 사용되는 교통비를 (-)로 두고, 해당 도시에서 얻을 수 있는 이득을 (+)로 둔다면 이 문제는 음의 사이클이 존재하는 최단경로를 구하는 문제가 된다. 즉 벨만 포드 알고리즘을 이용해 풀수 있게 된다. 하지만 음의 사이클이 존재한다고 할지라도 그 사이클에서 도착지점으로 갈 수 없다면, 이는 무의미 함으로 이를 예외처리를 시켜 풀어주어야 한다. 더보기 #include #include #include #include #define INF 2e15 using namespace std; int n, m, s, e; long long p..