Math Algorithm - 수학

01. 홀수와 짝수

  • 홀수 정의

    • odd number
    • 2로 나누어 떨어지지 않는 정수
  • 짝수 정의

    • even number
    • 2로 나누어 떨어지는 정수
  • 홀수와 짝수 판단

    const num
    
    if(num % 2 == 0) return "짝수"
    if(num % 2 == 1) return "홀수"
    

02. 2진수, 8진수, 16진수

  • 2진수를 8진수로 변환하기

    • 2진수의 수를 뒷자리부터 3자리씩 끊어내고, 각 자리에 4,2,1을 곱하면 8진수를 구할 수 있다. (처음 3개에 4,2,1을 곱하면, 다음 3개에는 32,16,8을 곱해야 할 것 같지만, 이미 자신의 자리 자체가 8이 곱해졌음을 의미하기에 4,2,1을 곱한다.)
    • [2진수]100 111 101 = 1(4)0(2)0(1) 1(4)1(2)1(1) 1(4)0(2)1(1) = [8진수]4 7 5

03. 소수

  • 정의

    • 1과 자기 자신 이외의 자연수로는 나누어 떨어지지 않는 자연수
    • 1은 소수가 아닌 유일한 자연수이다.
  • 에라토스테네스의 체

    • 소수를 찾는 방법
    • 100 이하의 소수를 구한다고 하면 1~100을 적고, 2부터 100까지 반복한다. (0, 1은 소수 아님)
    • 지워지지 않는 수 중에서 가장 작은 수는 2이다. 2는 소수이고, 2의 배수는 모두 소수가 아니므로 모두 지운다.
    • 그 다음 지워지지 않은 수 중에서 가장 작은 수는 3이고, 3도 소수이다. (소수가 아니였다면 이전에 지워졌어야 한다.) 3의 배수도 모두 지운다.
    • 위의 과정을 반복하며, 소수가 아닌 수는 모두 지운다.
    // 소수 찾기
    const isPrime = Array(N + 1).fill(true); // N까지의 소수를 찾는다.
    isPrime[0] = isPrime[1] = false; // 0, 1은 소수 아님
    
    for (let i = 2; i <= N; i++) {
    	if (!isPrime[i]) continue;
    
    	// 2+2, 2+2+2, 2+2+2+2 -> i의 배수 모두 지우기
    	for (let j = i + i; j <= N; j += i) {
    		isPrime[j] = false;
    	}
    }
    

04. 약수

  • 정의

    • 어떤 수를 나누어떨어지게 하는 수
  • 특징

    • 순서대로 나열된 약수들을 가지고 가운데를 기준으로 서로 곱하면 원래의 수가 된다.
    • 12 (1, 2, 3, 4, 6, 12)
    • 1 * 12 = 12
    • 2 * 6 = 12
    • 3 * 4 = 12

05. 최대공약수와 최소공배수

  • 최대공약수 정의

    • GCD (Greatest Common Divisor)
    • 두 수, 혹은 그 이상의 여러 수의 공통된 약수 중 가장 큰 것
  • 최소공배수 정의

    • LCM (Least Common Multiple)
    • 두 수, 혹은 그 이상의 수들의 공통인 배수 중 가장 작은 것
  • 유클리드 호제법

    • 최대공약수를 찾는 방법
    • 두 양의 정수 a 와 b (a > b) 에 대하여, a % b = r 이라 하면, a 와 b 의 최대공약수는 b 와 r 의 최대공약수와 같다.
    • 즉, a % b = r 이라고 했을 때, GCD(a, b) = GCD(b, r)과 같고, r = 0 일때 b 가 최대공약수 이다.
    const GCD = (a, b) => {
    	if (a % b == 0) return b;
    	else return GCD(b, a % b);
    };
    
  • 최대공약수(유클리드 호제법)를 이용해 최소공배수 찾기

    • 두 수와 최대공약수, 최소공배수 사이에는 아래와 같은 공식이 성립한다.
    • 두 수의 곱은 최대공약수와 최소공배수의 곱과 같다.
    • 즉, a * b = gcd * lcm
    • lcm = (a * b) / gcd
    const a, b = [6, 18];
    
    const gcd = GCD(a, b);
    const lcm = (a * b) / gcd
    

06. 수열

  • 정의

    • 수 또는 다른 대상의 순서 있는 나열
  • 풀이법

    • 값이 커지더라도 하나씩 나열하면서 그 안의 규칙을 찾아야 한다.
    • 초기에는 규칙이 없다가 나중에 규칙이 생기는 경우도 있어서, 값이 커진 후에 규칙을 찾는 것이 더욱 도움이 될 수 있다.

07. 피보나치 수

  • 정의

    • 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞의 두 항의 합인 수열이다.
  • 규칙

    • 1, 1, 2, 3, 5, 8
    • f(n) = f(n - 1) + f(n - 2)

999. 원

  • BOJ 1002 토대로 작성 예정