알고리즘: Snippets
2021-02-06
BOJ
gcd, lcm
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } // 최대공약수
ll lcm(ll a, ll b) { return a * b / gcd(a, b); } // 최소공배수
정렬
sort(v.begin(), v.end()); // 오름차순 정렬
sort(v.begin(), v.end(), greater<>()); // 내림차순 정렬
bool compare(int a, int b) { return a > b; }
sort(v.begin(), v.end(), compare); // 사용자 정의 정렬
순열
int main() {
int n; cin >> n;
vector<int> v(n);
for (int i = 0; i < n; i++) v[i] = i + 1;
sort(v.begin(), v.end());
do {
for (int i = 0; i < n; i++) {
cout << v[i] << " \n" [i == n - 1];
}
} while (next_permutation(v.begin(), v.end()));
return 0;
}
조합
int main() {
int n, k; cin >> n >> k;
vector<int> v(n);
vector<int> chk(n);
for (int i = 0; i < n; i++) v[i] = i + 1;
sort(v.begin(), v.end());
for (int i = 0; i < k; i++) chk[i] = 0;
for (int i = k; i < n; i++) chk[i] = 1;
do {
for (int i = 0; i < n; i++) {
if (chk[i] == 1) continue;
cout << v[i] << " ";
}
cout << "\n";
} while (next_permutation(chk.begin(), chk.end()));
return 0;
}
벡터의 최대, 최소값
int min = *min_element(v.begin(), v.end());
int max = *max_element(v.begin(), v.end());
lower_bound, upper_bound
// arr 부터 끝까지 탐색하면서 6 이상의 숫자가 처음으로 나오는 위치의 인덱스 번호를 반환
// 용도: 찾으려는 key 값보다 같거나 큰 숫자가 배열 몇 번째에서 처음 등장하는지 찾기 위함
// 사용 조건: 탐색을 진행할 배열 혹은 벡터는 오름차순 정렬되어 있어야 함
lower_bound(v.begin(), v.end(), 6) - v.begin();
// 처음부터 끝까지 탐색하면서 3을 처음으로 초과하는 숫자가 나오는 위치의 인덱스 번호를 반환
// 용도: 찾으려는 key 값을 초과하는 숫자가 배열 몇 번째에서 처음 등장하는지 찾기 위함
// 사용 조건: 탐색을 진행할 배열 혹은 벡터는 오름차순 정렬되어 있어야 함
upper_bound(v.begin(), v.end(), 3) - v.begin();
나눗셈 올림 (ceil)
int s;
if (n % k == 0) s = n / k;
else s = n / k + 1;
int s = (n + k - 1) / k;
에라토스테네스의 체
vector<int> v;
void eratos(int n) {
if (n <= 1) return;
bool sieve[n + 1];
for (int i = 2; i <= n; i++) sieve[i] = true;
for (int i = 2; i * i <= n; i++) {
if (sieve[i]) {
for (int j = i * i; j <= n; j += i) {
sieve[j] = false;
}
}
}
// 이후의 작업...
for (int i = 2; i <= n; i++) {
if (sieve[i]) v.push_back(i);
}
}