티스토리 뷰
수학적 사고를 통해 컴퓨팅 사고를 할 수 있어야 함
순열 Permutation
n개의 요소 중 r개를 순서에 상관 있게 뽑는 경우의 수
중복을 허용하지 않기 때문에 r <= n을 만족해야 함
조합 Combination
n개의 요소 중 r개를 뽑는 경우의 수(순서에 상관 없는 부분집합)
중복을 허용하지 않기 때문에 r <= n을 만족해야 함
n! 팩토리얼 factorial
n에서부터 1까지 모든 정수의 곱
순열과 조합 알고리즘은
반복문으로 작성시 선택할 개수만큼 반복문을 중첩해야하기 때문에 n개를 선택해야하는 경우 대응이 어려움
-> 재귀를 사용하여 풀이하는 경우가 많음
순서를 고려하여 카드 3장을 선택하는 경우의 수(순열)
function permutationLoop(lookup) {
let result = [];
for (let i = 0; i < lookup.length; i++) {
for (let j = 0; j < lookup.length; j++) {
for (let k = 0; k < lookup.length; k++) {
if(i === j || j === k || k === i) continue;
result.push([lookup[i], lookup[j], lookup[k]]) // 중복 요소 제거
}
}
}
return result;
}
순서에 상관없이 카드를 3장 선택하는 경우의 수(조합)
function combinationLoop(lookup) {
let result = [];
// 한 번 조합한 요소는 다시 조합하지 않음
for (let i = 0; i < lookup.length; i++) {
for (let j = i + 1; j < lookup.length; j++) {
for (let k = j + 1; k < lookup.length; k++) {
result.push([lookup[i], lookup[j], lookup[k]]);
}
}
}
return result;
}
최대공약수(GCD. Greatest Common Divisor)
공약수 중 최대인 수
- 공약수: 둘 이상의 수의 공통된 약수
- 약수: 어떤 수를 나누어 떨어지게 하는 수
유클리드 호제법
최대공약수를 구하는 식
2개의 자연수 a, b가 있을 때
a를 b로 나눈 나머지를 r이라하면
a와 b의 최대공약수는 b와 r의 최대공약수와 같다는 이론
-> 나머지가 0이 되었을 때 나눈 수가 a와 b의 최대공약수
// 유클리드 호제법(최대공약수 구하기)
function gcd(a, b){
while(b !== 0){
let r = a % b;
a = b;
b = r;
}
return a;
}
// 유클리드 호제법을 이용해 최소공배수 구하기
function lcm(a, b){
return a * (b / gcd(a, b));
}
최소공배수(LCM. Lowest Common Multiple)
공배수 중 최소인 수
- 공배수: 둘 이상의 수의 공통된 배수
- 배수: 하나의 수에 정수를 곱한 수
배수는 무수히 많기 때문에 최대공배수는 구할 수 없음
최소공배수 = 최대공약수 * a/최대공약수 * b/최대공약수 = a * b / 최대공약수
멱집합
어떤 집합의 모든 부분집합
요소가 있는지 없는지 두 가지 경우를 고려하기 때문에 부분집합의 수는 2^n(요소 개수)
- 멱집합을 구하는 방법은 순환구조를 띰
function powerSet (arr) {
const result = [];
function recursion (subset, start) {
result.push(subset);
for(let i = start; i < arr.length; i++){
recursion([...subset, arr[i]], i+1);
}
}
recursion([], 0);
return result;
}
23.02.08
코스 S4U11 알고리즘 수학
'코드스테이츠(SEB_FE_42)' 카테고리의 다른 글
[프로젝트] Git, Github(Issue, Milestone, Project), branch (0) | 2023.02.14 |
---|---|
[자료형] 정규표현식 Regular Expression (0) | 2023.02.08 |
[알고리즘] 시간 복잡도/ 공간 복잡도, Greedy Algorithm, Dynamic Programming (0) | 2023.02.07 |
[Deploy] Proxy (0) | 2023.02.06 |
[AWS] 레퍼런스 정리 (0) | 2023.02.05 |