알고리즘 문제를 풀다가 분배법칙에 관한 수학적인 문제가 나와 기억하기 위해 작성한다.
분배법칙(Distributive Property)
집합 S와 S에 대해 닫혀있는 두 이항 연산 *, +가 정의되어 있을 때, S의 임의의 원소 a, b, c에 대해
$ a * (b + c) = (a * b) + (a * c) $ 가 성립하면 (+에 대한 *의) 좌분배법칙이,
$ (b + c) * a = (b * a) + (c * a) $ 가 성립하면 (+에 대한 *의) 우분배법칙이 성립한다고 하며,
위 두 가지가 모두 성립할 경우 집합 S에서 연산 *은 연산 +에 대해 분배법칙(+에 대한 *의 (양쪽) 분배법칙)이 성립한다고 한다.
두 항을 곱할 때 각 항들을 나누어 곱한 후 더하는 방식이다.
즉, "(3 + 2) x 4"가 있을 때 "5 x 4 = 20"되는 것과 "3 x 4 + 2 x 4 = 20(분배법칙)"으로 같다는 것이다.
$$ (A + B)(C + D) = A \cdot C + A \cdot D + B \cdot C + B \cdot D $$
그럼 위 식으로 간단한 예제를 확인해 보겠습니다.
백준 15964 이상한 기호(구현 C++)
문제 내용은 다음과 같다.
"연산자의 기호는 @으로, A@B = (A+B)×(A-B)으로 정의 내리기로 했다. A, B가 주어지면 A@B를 계산하는 프로그램을 만들어주자!"
문제 자체가 아주 간단하기 때문에 정의한 식을 그대로 사용해도 통과하지만 분배법칙으로 더 간단하게 구할 수 있다.
정의한 식을 분배법칙으로 구하면 다음과 같다.
$$ (A + B) * (A - B) $$
$$ = A \cdot A - A \cdot B + B \cdot A - B \cdot B $$
$$ = A^2 - AB + AB - B^2 $$
$$ = A^2 - B^2 $$
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
typedef long long ll;
ll a, b;
int main(){
FAST_IO;
cin >> a >> b;
cout << a*a-b*b;
return 0;
}
🔗 Reference
'algorithm' 카테고리의 다른 글
지수법칙 & 모듈러 연산 (0) | 2025.02.13 |
---|---|
누적합(Prefix Sum) (0) | 2025.01.19 |
DFS (Depth-First Search) (0) | 2023.06.25 |
BFS (Breadth-First Search) (1) | 2023.06.17 |
큐(Queue) (0) | 2023.05.02 |