본문 바로가기

분류 전체보기

(89)
이진 탐색(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..
2024-03-29 TOPOLOGICAL SORTING 문제들 모아서 풀기 -선수 과목 (14567, 백준) 기본적인 위상정렬 문제이다. ans[x] = x과목을 이수할 수 있는 최소 학기로 두고 진입차수를 감소시킬 때마다 ans를 갱신해주어가며 풀었다. 그냥 DP로도 풀린다고한다. 더보기 #include #include #include #include using namespace std; int n, m; vector vec[1010]; int ent[1010], ans[1010]; int main() { int i, j; scanf("%d %d", &n, &m); for (i = 0; i < m; i++) { int x, y; scanf("%d %d", &x, &y); vec[x].push_back(y); ent[y]+..