
์ ๋ ฌ(Sorting)์ด๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ ์์๋๋ก ๋์ดํ๋ ๊ฒ์ ๋งํ๋ค
์ผ๋ฐ์ ์ผ๋ก ๋ฌธ์ ์ํฉ์ ๋ฐ๋ผ์ ์ ์ ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ๊ณต์์ฒ๋ผ ์ฌ์ฉ๋๋ค
์ ๋ ฌ์๋ ์ ํ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ํต ์ ๋ ฌ, ๊ณ์ ์ ๋ ฌ ๋ฑ๋ฑ์ด ์๋ค
๋ฐ์ดํฐ๊ฐ ๋ฌด์์๋ก ์ฌ๋ฌ ๊ฐ ์์ ๋ ์ด์ค์์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ์๋ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๊ณ , ๊ทธ๋ค์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ์์์ ๋ ๋ฒ์งธ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๋ ๊ณผ์
์ ๋ ฌ์์ ์๊ฐ ๋ณต์ก๋๊ฐ ์ค์ํ๋ฐ ๋ฐ๋ณต๋ฌธ์ ์ค์ฒฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค
์ ํ์ ๋ ฌ ๊ฐ์๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋๋ O(N^2)์ด๋ค
#include <iostream>
using namespace std;
int n = 10;
int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
int main()
{
for (int i = 0; i < n; i++)
{
int min_index = i;
for (int j = i + 1; j < n; j++)
{
if (arr[min_index] > arr[j])
min_index = j;
}
swap(arr[i], arr[min_index]);
}
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
return 0;
}
์ฒ๋ฆฌ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๊ณจ๋ผ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ค
์ ํ ์ ๋ ฌ์ ๋นํด ํจ์จ์
์ ํ์ ๋ ฌ๊ณผ ์๊ฐ๋ณต์ก๋๋ ๊ฐ์ง๋ง ๋ฐฐ์ด์ด ๊ฑฐ์ ์ ๋ ฌ์ด ๋์ด์๋ค๋ฉด ์ ํ์ ๋ ฌ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋์ํ๋ค
#include <iostream>
using namespace std;
int n = 10;
int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
int main()
{
for (int i = 1; i < n; i++)
{
for (int j = i; j > 0; j--)
{
if (arr[j] < arr[j - 1])
swap(arr[j], arr[j - 1]);
else
break;
}
}
for(int i = 0; i < n; i++)
cout << arr[i] << ' ';
return 0;
}
๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
์ผ๋ฐ์ ์ธ ์ํฉ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ด๋ค
๋ณํฉ ์ ๋ ฌ๊ณผ ๋๋ถ์ด ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ทผ๊ฐ์ด ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํต ์ ๋ ฌ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค ๋ฐ์ดํฐ(Pivot)๋ก ์ค์ ํฉ๋๋ค

๋ค์๊ณผ ๊ฐ์ด ํผ๋ฒ์ ์ค์ ํ๊ณ ์ผ์ชฝ์์ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ ์ ํํ๊ณ ์ค๋ฅธ์ชฝ์์ ๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ํ์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค ๊ณ์๋ฐ๋ณตํ๋ค๊ฐ ๋ ๊ฐ์ด ์๊ฐ๋ฆฐ ๊ฒฝ์ฐ์ ํผ๋ฒ์ ์์น๋ฅผ ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ์์น๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ถํ ํ ํ ์๋ก์ด ํผ๋ฒ์ ์ค์ ํ๊ณ ๋ฐ๋ณตํ๋ค
์๊ฐ๋ณต์ก๋๋ O(NlogN)์ด์ง๋ง ์ต์
์๊ฒฝ์ฐ O(N^2)๊ฐ ๋์ค๊ธฐ๋ ํ๋ค
#include <iostream>
using namespace std;
int n = 10;
int arr[10] = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};
void quickSort(int* arr, int start, int end)
{
if (start >= end)
return;
int pivot = start;
int left = start + 1;
int right = end;
while (left <= right)
{
while (left <= end && arr[left] <= arr[pivot])
left++;
while (right > start && arr[right] >= arr[pivot])
right--;
if (left > right)
swap(arr[pivot], arr[right]);
else
swap(arr[left], arr[right]);
}
quickSort(arr, start, right - 1);
quickSort(arr, right + 1, end);
}
int main()
{
quickSort(arr, 0, n - 1);
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
}
์ฝ๋๋ ์์์ง์ ๊ณผ ๋์ง์ ๋๊ฐ๋ฅผ ์ง์ ํด๋๊ณ ์ ๋ ฌํ๋ค
ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค
๊ณ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N, ๋ฐ์ดํฐ(์์) ์ค ์ต๋๊ฐ์ด K์ผ ๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ ์ํ์๊ฐ O(N+K)๋ฅผ ๋ณด์ฅํ๋ค
๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ด์์ ์๋ ๋ฐฐ์ด์ ์ ์ธํ๊ณ ๊ฐ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ช๋ฒ ๋ฑ์ฅํ๋์ง ์ ์ฅํด๋๊ณ ์ถ๋ ฅํ๋ค
#include <iostream>
#define MAX_VALUE 9
using namespace std;
int n = 15;
int arr[15] = {7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2};
int cnt[MAX_VALUE + 1];
int main()
{
for (int i = 0; i < n; i++)
cnt[arr[i]] += 1;
for (int i = 0; i <= MAX_VALUE; i++)
{
for (int j = 0; j < cnt[i]; j++)
cout << i << ' ';
}
}
์์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋์์ค
#include <iostream>
#include <algorithm>
using namespace std;
int arr[501];
bool compare(int a, int b)
{
return a > b;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
sort(arr, arr + n, compare);
for (int i = 0; i < n; i++)\
cout << arr[i] << " ";
return 0;
}
๋จ์ํ๊ฒ ๋ฐฐ์ด์ ์ ์ธํ๊ณ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์๋ค ๋น๊ต๋ฅผ์ํด compare ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์๋ค.
N๋ช ์ ํ์์ ์ด๋ฆ๊ณผ ์ฑ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋ ์ฑ์ ์ด ๋ฎ์ ์์๋๋ก ํ์์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ผ
์์ ์ ๋ฐฑ์ค์์ ํผ ๋ฌธ์ ๊ฐ ๋๊ฐ์์ ์ฝ๊ฒ ํ์๋ค pair๋ฅผ ์ด์ฉํด์ string, int ํ์ผ๋ก ๋ฐ๊ณ ๋น๊ต๋ฅผ ํ ํ ์ถ๋ ฅํด์ฃผ์๋ค ์์ ์ ๋ ฌ์ ์
๋ ฅํ ์์๋๋ก ๋์ค๋๊ฑธ ๋งํ๋ค
์ฐธ๊ณ ๋ฌธ์
10814 ๋์ด์์ ๋ ฌ
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool comp(pair<string, int> x, pair<string, int> y)
{
return x.second < y.second;
}
int N;
vector<pair<string, int>> v;
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
string a;
int b;
cin >> a >> b;
v.push_back({a, b});
}
stable_sort(v.begin(), v.end(),comp);
for(auto c : v)
cout << c.first << " ";
}
๋๋น์ด๋ ๋๊ฐ์ ๋ฐฐ์ด A์ B๋ฅผ ๊ฐ์ง๊ณ ์๋ค ๋ ๋ฐฐ์ด์ N๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๋ฐฐ์ด์ ์์๋ ๋ชจ๋ ์์ฐ์์ด๋ค. ๋๋น์ด๋ ์ต๋ K๋ฒ์ ๋ฐ๊ฟ์น๊ธฐ ์ฐ์ฐ์ ์ํํ ์ ์๋๋ฐ, ๋ฐ๊ฟ์น๊ธฐ ์ฐ์ฐ์ด๋ ๋ฐฐ์ด A์ ์๋ ์์ ํ๋์ ๋ฐฐ์ด B์ ์๋ ์์ ํ๋๋ฅผ ๊ณจ๋ผ์ ๋ ์์๋ฅผ ์๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋งํ๋ค. ๋๋น์ด์ ์ต์ข ๋ชฉํ๋ ๋ฐฐ์ด A์ ๋ชจ๋ ์์์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ด๋ค
๋๊ฐ์ ๋ฐฐ์ด์ ๊ฐ๊ฐ ์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ์ ํ๊ณ ๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ์ฐจ๋ก๋ก ํ์ธํ๊ณ A์ ์์๊ฐ B์ ์์๋ณด๋ค ์์๊ฒฝ์ฐ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> a, b;
bool compare(int x, int y)
{
return x > y;
}
int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
a.push_back(x);
}
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
b.push_back(x);
}
sort(a.begin(), a.end());
sort(b.begin(), b.end(), compare);
for (int i = 0; i < k; i++)
{
if (a[i] < b[i])
swap(a[i], b[i]);
else
break;
}
long long result = 0;
for (int i = 0; i < n; i++)
result += a[i];
cout << result << "\n";
}
n๊ฐ์ ์๋ก ๋ค๋ฅธ ์์ ์ ์ a1, a2, ..., an์ผ๋ก ์ด๋ฃจ์ด์ง ์์ด์ด ์๋ค. ai์ ๊ฐ์ 1๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 1000000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ์์ฐ์ x๊ฐ ์ฃผ์ด์ก์ ๋, ai + aj = x (1 โค i < j โค n)์ ๋ง์กฑํ๋ (ai, aj)์์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ฒ์ ์๊ฐ์ผ๋ก๋ ์ ๋ ฌํ ํ ๋ ์๋ฅผ ์ด์ค๋ฐ๋ณต๋ฌธ์ผ๋ก ๋๋ ค๊ฐ๋ฉด์ ๋ํด๋ณด๋ ค๊ณ ํ๋๋ฐ ์ธํฐ๋ท์ ์ฐพ์๋ณด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋๋ค๊ณ ๋์์์ด์ ์ข ํน์ดํ ์ฝ๋๊ฐ ์๊ธธ๋ ์ฐธ๊ณ ํด๋ณด์๋ค
#include <iostream>
using namespace std;
int num[2000001];
int main()
{
int n, a, b;
int cnt = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a;
num[a]++;
}
cin >> b;
for (int i = 0; i < (b + 1)/2; i++)
{
if (num[i] == 1 && num[b - i] == 1)
cnt++;
}
cout << cnt << endl;
}
์ด๋ฐ์์ผ๋ก ํ๋ฉด ์ ์ด์ ์ ๋ ฌ์ ํ ํ์๋ ์์ด์ง๊ณ ๋จ์ํ ์ธ๋ฑ์ค๋ง ์ฐธ์กฐํ์ฌ์ ํ ์ ์์ด์ ์ข๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ธ๊ฑฐ ๊ฐ๋ค