일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 고전소설
- 밑바닥부터 시작하는 딥러닝2
- tree purning
- dynamic programming
- word2vec
- do it! 알고리즘 코딩테스트: c++편
- DFS
- 밑바닥부터 시작하는 딥러닝
- boosting for regression
- jini impurity
- Python
- classification
- CBOW
- C++
- underfiting
- Baekjoon
- overfiting
- deep learning
- marchine learning
- SQLD
- Language model
- Machine Learning
- Backtracking
- boosting for classification
- RNN
- numpy
- 딥러닝
- Linear Regression
- model selection
- BFS
- Today
- Total
newhaneul
[Do it! 알고리즘 코딩테스트: Chapter 4] 버블 정렬(Bubble Sort), 선택 정렬(Selection sort) 본문
[Do it! 알고리즘 코딩테스트: Chapter 4] 버블 정렬(Bubble Sort), 선택 정렬(Selection sort)
뉴하늘 2025. 3. 6. 14:33본 포스팅은 Do it! 알고리즘 코딩테스트: C++편을 토대로 공부한 내용을 정리하기 위한 포스팅입니다.
https://github.com/KwonKiHyeok/Do_it_Alogrithm_Coding_Test_with_Cpp
GitHub - KwonKiHyeok/Do_it_Alogrithm_Coding_Test_with_Cpp: Do it! 알고리즘 코딩 테스트: C++편
Do it! 알고리즘 코딩 테스트: C++편. Contribute to KwonKiHyeok/Do_it_Alogrithm_Coding_Test_with_Cpp development by creating an account on GitHub.
github.com
1. 버블 정렬 (Bubble Sort)
인접한 두 원소를 비교하여 교환하는 방식으로 정렬하는 알고리즘이다.
큰 값이 점점 뒤로 이동하는 모습이 거품이 떠오르는 것과 비슷해서 "버블 정렬"이라고 한다.
- 동작 방식
- 첫 번째 원소부터 인접한 원소끼리 비교하여 큰 값을 뒤로 이동한다.
- 한 바퀴 돌면 가장 큰 값이 맨 뒤로 정렬된다.
- 다음 라운드에서 마지막 정렬된 원소를 제외하고 반복한다.
- 배열이 정렬될 때까지 반복한다.
- 시간 복잡도
- 최선: O(n) (이미 정렬된 경우)
- 평균: O(n^2)
- 최악: O(n^2)
- 특징
- 구현이 쉽지만, 효율이 낮아 실제로는 잘 사용되지 않는다.
- 안정 정렬(Stable Sort)이다.
// Baekjoon Online Judge Problem. 2750
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> myVector(N, 0);
for (int i = 0; i < N; i++) {
cin >> myVector[i];
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N - i - 1; j++) {
if (myVector[j] > myVector[j + 1]) {
int temp = myVector[j];
myVector[j] = myVector[j + 1];
myVector[j + 1] = temp;
}
}
}
for (int i = 0; i < N; i++) {
cout << myVector[i] << '\n';
}
return 0;
}
// Baekjoon Online Judge Problem. 1377
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<pair<int, int>> A(N);
for (int i = 0; i < N; i++) {
cin >> A[i].first;
A[i].second = i;
}
sort(A.begin(), A.end());
int max = -1;
for (int i = 0; i < N; i++) {
if (max < A[i].second - i) {
max = A[i].second - i;
}
}
cout << max + 1<< '\n';
return 0;
}
이 문제의 핵심은 swap을 통해 데이터가 왼쪽으로 이동할 수 있는 최대 거리가 1이라는 점을 캐치하는 것이었다. 따라서 for문을 몇 번 이동했는지는 정렬 전 index와 정렬 후 index의 차이에 1을 더한 값과 같다. 버블 정렬로 문제를 해결하면 시간 복잡도가 O(n^2)이 돼서 시간 초과가 걸리게 된다. 하지만 <algorithm> 라이브러리의 sort() 함수를 사용하면 시간 복잡도가 O(nlogn)이 되므로 해결할 수 있게 된다.
문제를 해결하기 위해서는 vector 변수에 2가지 이상의 정보를 저장할 수 있어야 했다. 이를 위해서는 struct, pair, tuple 중 한 가지를 사용해야 한다. 문제에서는 pair를 사용했다. 아직 vector 라이브러리에 미숙해서 이런 자료들이 있는지 몰랐고 어떻게 적용하는지도 잘 몰라서 검색을 많이 했다. C++ 언어 공부도 열심히 해야겠다.
#include<utility> // pair의 헤더파일
pair class는 utility 헤더파일에 존재하는 STL이다. 하지만 vector, alogrithm 헤더파일에 이미 utility 헤더파일이 포함되어 있기 때문에 굳이 포함 할 필요는 없다.
template <class T1, class T2> struct pair;
#include<iostream>
#include<vector>
using namespace std;
pair<int, double> p;
int main() {
vector<pair<int, int>> vec; // vector와 pair를 함께 사용
p.first = 5; // pair의 첫번째 인자에 접근
p.second = 10; // pair의 두번째 인자에 접근
p = make_pair(1, 2.1); // make_pair
return 0;
}
2. 선택 정렬 (Selection Sort)
가장 작은 원소를 선택하여 맨 앞부터 차례로 정렬하는 방식이다.
- 동작 방식
- 주어진 리스트에서 최솟값을 찾는다.
- 최솟값을 맨 앞 원소와 교환한다.
- 나머지 리스트에서 다시 최솟값을 찾아 두 번째 원소와 교환한다.
- 이 과정을 리스트 끝까지 반복한다.
- 시간 복잡도
- 최선: O(n^2)
- 평균: O(n^2)
- 최악: O(n^2)
- 특징
- 비교 횟수가 많아 비효율적이다.
- 불안정 정렬(Unstable Sort)이다.
// Baekjoon Online Judge Problem. 1427
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
string str;
cin >> str;
vector<int> v(str.size(), 0);
for (int i = 0; i < str.size(); i++) {
v[i] = str[i] - '0';
}
for (int i = 0; i < str.size(); i++) {
pair<int, int> max;
max.first = v[i];
max.second = i;
for (int j = i; j < str.size(); j++) {
if (max.first < v[j]) {
max.first = v[j];
max.second = j;
}
}
int temp = v[i];
v[i] = max.first;
v[max.second] = temp;
}
for (int i = 0; i < str.size(); i++) {
cout << v[i];
}
return 0;
}
'1. Programming > Alogrithm' 카테고리의 다른 글
[Do it! 알고리즘 코딩테스트: Chapter 4] 병합 정렬(Merge Sort), 기수 정렬(Radix Sort) (0) | 2025.03.09 |
---|---|
[Do it! 알고리즘 코딩테스트: Chapter 4] 삽입 정렬(Insertion Sort), 퀵 정렬(Quick Sort) (0) | 2025.03.07 |
[Do it! 알고리즘 코딩테스트: Chapter 3] 스택과 큐(Stack and Queue) (0) | 2025.03.05 |
[Do it! 알고리즘 코딩테스트: Chapter 3] 슬라이딩 윈도우(Sliding Window) (0) | 2025.03.04 |
[Do it! 알고리즘 코딩테스트: Chapter 3] 투 포인터 알고리즘(Two Pointer Algorithm) (0) | 2025.03.04 |