๐น ํ๋ ฌ ๊ณฑ์ (Matrix Multiplication)์ด๋?
ํ๋ ฌ ๊ณฑ์
์ ๋ ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด(ํ๋ ฌ)์ ๊ณฑํ๋ ์ฐ์ฐ์
๋๋ค.
ํ๋ ฌ ๊ณฑ์
์ ๋จ์ํ ์์๋ณ ๊ณฑ์
์ด ์๋๋ผ ํ๊ณผ ์ด์ ์ด์ฉํ ์ฐ์ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
โ 1. ํ๋ ฌ ๊ณฑ์ ์ ์กฐ๊ฑด
A(ํ๋ ฌ)
์ดm ร n
ํฌ๊ธฐ์ด๊ณ ,B(ํ๋ ฌ)
์ดn ร p
ํฌ๊ธฐ๋ผ๋ฉด,- A์ ์ด ๊ฐ์(
n
)๊ณผ B์ ํ ๊ฐ์(n
)๊ฐ ๊ฐ์์ผ ๊ณฑํ ์ ์์ - ๊ฒฐ๊ณผ ํ๋ ฌ
C
๋m ร p
ํฌ๊ธฐ์ ํ๋ ฌ์ด ๋จ
- A์ ์ด ๊ฐ์(
๐น ์ฆ, A(m ร n) * B(n ร p) = C(m ร p)
โ 2. ํ๋ ฌ ๊ณฑ์ ๊ณผ์
ํ๋ ฌ A์ B๊ฐ ์ฃผ์ด์ก์ ๋, A์ ๊ฐ ํ(row)๊ณผ B์ ๊ฐ ์ด(column)์ ๊ณฑํด์ ๋ํ ๊ฐ์ด ๊ฒฐ๊ณผ ํ๋ ฌ C์ ์์๊ฐ ๋ฉ๋๋ค.
์์
A (2 ร 3 ํ๋ ฌ)
| 1 2 3 |
| 4 5 6 |
B (3 ร 2 ํ๋ ฌ)
| 7 8 |
| 9 10 |
| 11 12 |
๊ฒฐ๊ณผ ํ๋ ฌ C (2 ร 2 ํ๋ ฌ) ๊ณ์ฐ ๊ณผ์
C์ (i, j)
์์น ๊ฐ์ A์ i๋ฒ์งธ ํ๊ณผ B์ j๋ฒ์งธ ์ด์ ๊ณฑํด์ ๋ํ ๊ฐ.
C[0][0] = (1ร7) + (2ร9) + (3ร11) = 7 + 18 + 33 = 58
C[0][1] = (1ร8) + (2ร10) + (3ร12) = 8 + 20 + 36 = 64
C[1][0] = (4ร7) + (5ร9) + (6ร11) = 28 + 45 + 66 = 139
C[1][1] = (4ร8) + (5ร10) + (6ร12) = 32 + 50 + 72 = 154
๊ฒฐ๊ณผ ํ๋ ฌ C:
| 58 64 |
| 139 154 |
โ 3. ํ๋ ฌ ๊ณฑ์ ์ผ๋ฐ ๊ณต์
๊ฒฐ๊ณผ ํ๋ ฌ C
์ (i, j)
์์๋ฅผ ๊ตฌํ๋ ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
C[i][j] = A[i][0] x B[0][j] + A[i][1] x B[1][j] + โฆ + A[i][n-1] x B[n-1][j]
์ฆ, A์ i๋ฒ์งธ ํ๊ณผ B์ j๋ฒ์งธ ์ด์ ๊ณฑํ ํ ๋ํ ๊ฐ์ด C[i][j]
๊ฐ ๋ฉ๋๋ค.
๐น ๋ฌธ์ ํ์ด
function solution(arr1, arr2) {
// 1. ํ๋ ฌ arr1๊ณผ arr2์ ํ๊ณผ ์ด์ ๊ฐ์ ์ ์ฅ
const row1 = arr1.length; // arr1์ ํ ๊ฐ์
const column1 = arr1[0].length; // arr1์ ์ด ๊ฐ์ (== arr2์ ํ ๊ฐ์)
const row2 = arr2.length; // arr2์ ํ ๊ฐ์
const column2 = arr2[0].length; // arr2์ ์ด ๊ฐ์
// 2. ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ 2์ฐจ์ ๋ฐฐ์ด ์ด๊ธฐํ (row1 x column2 ํฌ๊ธฐ)
const result = [];
for (let i = 0; i < row1; i++) {
result.push(new Array(column2).fill(0)); // 0์ผ๋ก ์ด๊ธฐํ๋ ๋ฐฐ์ด ์ถ๊ฐ
}
// 3. ํ๋ ฌ ๊ณฑ์
์ฐ์ฐ ์ํ (3์ค for๋ฌธ)
// ๐น arr1์ ํ ๊ฐ์๋งํผ ๋ฐ๋ณต (๊ฒฐ๊ณผ ํ๋ ฌ์ ํ)
for (let i = 0; i < row1; i++) {
// ๐น arr2์ ์ด ๊ฐ์๋งํผ ๋ฐ๋ณต (๊ฒฐ๊ณผ ํ๋ ฌ์ ์ด)
for (let j = 0; j < column2; j++) {
// โฌ๏ธ ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ ํ๋ ฌ result[i][j]์ ๊ฐ์ ๊ณ์ฐํจ
// ๐น arr1์ ์ด ๊ฐ์ == arr2์ ํ ๊ฐ์๋งํผ ๋ฐ๋ณต
for (let k = 0; k < column1; k++) {
/**
* arr1[i][k] โ arr1์ i๋ฒ์งธ ํ์์ k๋ฒ์งธ ์์ ์ ํ
* arr2[k][j] โ arr2์ j๋ฒ์งธ ์ด์์ k๋ฒ์งธ ์์ ์ ํ
* ๋ ์์๋ฅผ ๊ณฑํ ํ ๊ฒฐ๊ณผ ํ๋ ฌ์ ํด๋น ์์น(result[i][j])์ ๋ํจ
*/
result[i][j] += arr1[i][k] * arr2[k][j];
// ๐น ํ๋ ฌ ๊ณฑ์
์๋ฆฌ
// ์๋ฅผ ๋ค์ด arr1[i]๊ฐ [1, 2, 3]์ด๊ณ arr2[k, j]๊ฐ [4, 5, 6]์ผ ๋:
// result[i][j] = (1*4) + (2*5) + (3*6)
}
}
}
return result;
}
๐น ์ฝ๋ ์คํ ์์
console.log(solution(
[[1, 2, 3], [4, 5, 6]], // arr1 (2x3 ํ๋ ฌ)
[[7, 8], [9, 10], [11, 12]] // arr2 (3x2 ํ๋ ฌ)
));
๐น ๊ณ์ฐ ๊ณผ์
result[0][0] = (1*7) + (2*9) + (3*11) = 7 + 18 + 33 = 58
result[0][1] = (1*8) + (2*10) + (3*12) = 8 + 20 + 36 = 64
result[1][0] = (4*7) + (5*9) + (6*11) = 28 + 45 + 66 = 139
result[1][1] = (4*8) + (5*10) + (6*12) = 32 + 50 + 72 = 154
๐น ์ถ๋ ฅ ๊ฒฐ๊ณผ
[[58, 64], [139, 154]]
๐น ์ ๋ฆฌ
โ ํ๋ ฌ ๊ณฑ์
์ A์ ํ๊ณผ B์ ์ด์ ๊ณฑํด์ ๋ํ๋ ๋ฐฉ์
โ A์ ์ด ๊ฐ์์ B์ ํ ๊ฐ์๊ฐ ๊ฐ์์ผ ๊ณฑ์
๊ฐ๋ฅ
โ ์ด์ค for๋ฌธ์ ์ด์ฉํด A์ ํ ร B์ ์ด์ ๋ฐ๋ณตํ๋ฉฐ ๊ณ์ฐ
โ JavaScript๋ก๋ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ ํ์ฉํ์ฌ ๊ตฌํ ๊ฐ๋ฅ
'algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ํ ์ธ๋ฑ์ฑ (0) | 2025.02.22 |
---|---|
ํต์ฌํค์๋์ ๋ฐ๋ฅธ ์๊ณ ๋ฆฌ์ฆ ์ ํ ๋ฐฉ๋ฒ (1) | 2025.02.21 |
[240618 TIL] Sliding Window (0) | 2024.06.18 |
[240612 TIL] ์์ ํ์, ๋นํธ์ฐ์ฐ์ (0) | 2024.06.12 |
[240529 TIL] ๊ธฐ์ฌ๋จ์์ ๋ฌด๊ธฐ(์ฝ๋ฉํ ์คํธ) (0) | 2024.05.29 |
๐น ํ๋ ฌ ๊ณฑ์ (Matrix Multiplication)์ด๋?
ํ๋ ฌ ๊ณฑ์
์ ๋ ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด(ํ๋ ฌ)์ ๊ณฑํ๋ ์ฐ์ฐ์
๋๋ค.
ํ๋ ฌ ๊ณฑ์
์ ๋จ์ํ ์์๋ณ ๊ณฑ์
์ด ์๋๋ผ ํ๊ณผ ์ด์ ์ด์ฉํ ์ฐ์ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
โ 1. ํ๋ ฌ ๊ณฑ์ ์ ์กฐ๊ฑด
A(ํ๋ ฌ)
์ดm ร n
ํฌ๊ธฐ์ด๊ณ ,B(ํ๋ ฌ)
์ดn ร p
ํฌ๊ธฐ๋ผ๋ฉด,- A์ ์ด ๊ฐ์(
n
)๊ณผ B์ ํ ๊ฐ์(n
)๊ฐ ๊ฐ์์ผ ๊ณฑํ ์ ์์ - ๊ฒฐ๊ณผ ํ๋ ฌ
C
๋m ร p
ํฌ๊ธฐ์ ํ๋ ฌ์ด ๋จ
- A์ ์ด ๊ฐ์(
๐น ์ฆ, A(m ร n) * B(n ร p) = C(m ร p)
โ 2. ํ๋ ฌ ๊ณฑ์ ๊ณผ์
ํ๋ ฌ A์ B๊ฐ ์ฃผ์ด์ก์ ๋, A์ ๊ฐ ํ(row)๊ณผ B์ ๊ฐ ์ด(column)์ ๊ณฑํด์ ๋ํ ๊ฐ์ด ๊ฒฐ๊ณผ ํ๋ ฌ C์ ์์๊ฐ ๋ฉ๋๋ค.
์์
A (2 ร 3 ํ๋ ฌ)
| 1 2 3 |
| 4 5 6 |
B (3 ร 2 ํ๋ ฌ)
| 7 8 |
| 9 10 |
| 11 12 |
๊ฒฐ๊ณผ ํ๋ ฌ C (2 ร 2 ํ๋ ฌ) ๊ณ์ฐ ๊ณผ์
C์ (i, j)
์์น ๊ฐ์ A์ i๋ฒ์งธ ํ๊ณผ B์ j๋ฒ์งธ ์ด์ ๊ณฑํด์ ๋ํ ๊ฐ.
C[0][0] = (1ร7) + (2ร9) + (3ร11) = 7 + 18 + 33 = 58
C[0][1] = (1ร8) + (2ร10) + (3ร12) = 8 + 20 + 36 = 64
C[1][0] = (4ร7) + (5ร9) + (6ร11) = 28 + 45 + 66 = 139
C[1][1] = (4ร8) + (5ร10) + (6ร12) = 32 + 50 + 72 = 154
๊ฒฐ๊ณผ ํ๋ ฌ C:
| 58 64 |
| 139 154 |
โ 3. ํ๋ ฌ ๊ณฑ์ ์ผ๋ฐ ๊ณต์
๊ฒฐ๊ณผ ํ๋ ฌ C
์ (i, j)
์์๋ฅผ ๊ตฌํ๋ ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
C[i][j] = A[i][0] x B[0][j] + A[i][1] x B[1][j] + โฆ + A[i][n-1] x B[n-1][j]
์ฆ, A์ i๋ฒ์งธ ํ๊ณผ B์ j๋ฒ์งธ ์ด์ ๊ณฑํ ํ ๋ํ ๊ฐ์ด C[i][j]
๊ฐ ๋ฉ๋๋ค.
๐น ๋ฌธ์ ํ์ด
function solution(arr1, arr2) {
// 1. ํ๋ ฌ arr1๊ณผ arr2์ ํ๊ณผ ์ด์ ๊ฐ์ ์ ์ฅ
const row1 = arr1.length; // arr1์ ํ ๊ฐ์
const column1 = arr1[0].length; // arr1์ ์ด ๊ฐ์ (== arr2์ ํ ๊ฐ์)
const row2 = arr2.length; // arr2์ ํ ๊ฐ์
const column2 = arr2[0].length; // arr2์ ์ด ๊ฐ์
// 2. ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ 2์ฐจ์ ๋ฐฐ์ด ์ด๊ธฐํ (row1 x column2 ํฌ๊ธฐ)
const result = [];
for (let i = 0; i < row1; i++) {
result.push(new Array(column2).fill(0)); // 0์ผ๋ก ์ด๊ธฐํ๋ ๋ฐฐ์ด ์ถ๊ฐ
}
// 3. ํ๋ ฌ ๊ณฑ์
์ฐ์ฐ ์ํ (3์ค for๋ฌธ)
// ๐น arr1์ ํ ๊ฐ์๋งํผ ๋ฐ๋ณต (๊ฒฐ๊ณผ ํ๋ ฌ์ ํ)
for (let i = 0; i < row1; i++) {
// ๐น arr2์ ์ด ๊ฐ์๋งํผ ๋ฐ๋ณต (๊ฒฐ๊ณผ ํ๋ ฌ์ ์ด)
for (let j = 0; j < column2; j++) {
// โฌ๏ธ ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ ํ๋ ฌ result[i][j]์ ๊ฐ์ ๊ณ์ฐํจ
// ๐น arr1์ ์ด ๊ฐ์ == arr2์ ํ ๊ฐ์๋งํผ ๋ฐ๋ณต
for (let k = 0; k < column1; k++) {
/**
* arr1[i][k] โ arr1์ i๋ฒ์งธ ํ์์ k๋ฒ์งธ ์์ ์ ํ
* arr2[k][j] โ arr2์ j๋ฒ์งธ ์ด์์ k๋ฒ์งธ ์์ ์ ํ
* ๋ ์์๋ฅผ ๊ณฑํ ํ ๊ฒฐ๊ณผ ํ๋ ฌ์ ํด๋น ์์น(result[i][j])์ ๋ํจ
*/
result[i][j] += arr1[i][k] * arr2[k][j];
// ๐น ํ๋ ฌ ๊ณฑ์
์๋ฆฌ
// ์๋ฅผ ๋ค์ด arr1[i]๊ฐ [1, 2, 3]์ด๊ณ arr2[k, j]๊ฐ [4, 5, 6]์ผ ๋:
// result[i][j] = (1*4) + (2*5) + (3*6)
}
}
}
return result;
}
๐น ์ฝ๋ ์คํ ์์
console.log(solution(
[[1, 2, 3], [4, 5, 6]], // arr1 (2x3 ํ๋ ฌ)
[[7, 8], [9, 10], [11, 12]] // arr2 (3x2 ํ๋ ฌ)
));
๐น ๊ณ์ฐ ๊ณผ์
result[0][0] = (1*7) + (2*9) + (3*11) = 7 + 18 + 33 = 58
result[0][1] = (1*8) + (2*10) + (3*12) = 8 + 20 + 36 = 64
result[1][0] = (4*7) + (5*9) + (6*11) = 28 + 45 + 66 = 139
result[1][1] = (4*8) + (5*10) + (6*12) = 32 + 50 + 72 = 154
๐น ์ถ๋ ฅ ๊ฒฐ๊ณผ
[[58, 64], [139, 154]]
๐น ์ ๋ฆฌ
โ ํ๋ ฌ ๊ณฑ์
์ A์ ํ๊ณผ B์ ์ด์ ๊ณฑํด์ ๋ํ๋ ๋ฐฉ์
โ A์ ์ด ๊ฐ์์ B์ ํ ๊ฐ์๊ฐ ๊ฐ์์ผ ๊ณฑ์
๊ฐ๋ฅ
โ ์ด์ค for๋ฌธ์ ์ด์ฉํด A์ ํ ร B์ ์ด์ ๋ฐ๋ณตํ๋ฉฐ ๊ณ์ฐ
โ JavaScript๋ก๋ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์ค์ฒฉ ๋ฐ๋ณต๋ฌธ์ ํ์ฉํ์ฌ ๊ตฌํ ๊ฐ๋ฅ
'algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ํ ์ธ๋ฑ์ฑ (0) | 2025.02.22 |
---|---|
ํต์ฌํค์๋์ ๋ฐ๋ฅธ ์๊ณ ๋ฆฌ์ฆ ์ ํ ๋ฐฉ๋ฒ (1) | 2025.02.21 |
[240618 TIL] Sliding Window (0) | 2024.06.18 |
[240612 TIL] ์์ ํ์, ๋นํธ์ฐ์ฐ์ (0) | 2024.06.12 |
[240529 TIL] ๊ธฐ์ฌ๋จ์์ ๋ฌด๊ธฐ(์ฝ๋ฉํ ์คํธ) (0) | 2024.05.29 |