Post

프로그래머스 LV2 "행렬의 곱셈"

프로그래머스 LV2 행렬의 곱셈

기초부터 다시 공부를 하기위해 프로그래머스 라는 사이트에서 코딩테스트를 LV0 부터 가능한곳까지 못하는곳은 레퍼런스를 찾아가며 풀어보려고 합니다.

매일 1개의 풀이를 하고 그 풀이에대한 나의 생각 및 해석을 적어보려합니다.

오늘은 LV2 문제 ‘행렬의 곱셈’ 문제입니다.

프로그래머스 이미지

위 이미지가 프로그래머스 코딩문제입니다.

문제는 매개변수로 행렬 arr1arr2를 입력받아, 행렬 곱셈을 실행해 결과값을 출력하는 문제입니다.

그럼 오늘의 문제를 한번 풀어보겠습니다.

기본 세팅 코드도 알아보겠습니다.

1
2
3
4
function solution(arr1, arr2) {
  var answer = [[]];
  return answer;
}

기본 세팅 코드는 매개변수로 arr1arr2가 입력되고 함수 안에는 answer이라는 변수가 선언되어 리턴하는 간단한 기본 세팅 코드입니다.

문제를 풀기 전에 이전 포스팅에서 행렬의 덧셈이 무엇인지 알아보았습니다. 이번에는 행렬의 곱셈은 어떻게 하는것인지 알아보고 문제를 해결해 보겠습니다.

행렬이란?

행렬(matrix)은 수학에서 사용되는 개념으로, 특히 프로그래밍에서는 다차원 배열로 표현됩니다. 행렬은 수를 사각형 모양의 배열로 나열한 것으로, 각각의 숫자는 행(row)과 열(column)의 위치에 따라 지정됩니다. JavaScript에서도 행렬을 다차원 배열로 표현할 수 있습니다.

예를 들어, 다음과 같은 2x3 행렬은 JavaScript의 다차원 배열로 표현할 수 있습니다:

1
2
3
4
const matrix = [
  [1, 2, 3],
  [4, 5, 6]
];

여기서 matrix는 2개의 행과 3개의 열로 이루어진 행렬입니다.

이때, 행렬의 각 요소에 접근하려면 인덱스를 사용하여 접근할 수 있습니다. 예를 들어, (0, 1) 위치의 요소는 matrix[0][1]로 접근할 수 있습니다. 이는 첫 번째 행의 두 번째 열을 나타냅니다.

우선 이렇게 간단하게 행렬이 무엇인지 알아보았습니다.

그럼 이어서 행렬 곱셈은 무엇이고 어떻게 하는지 알아보겠습니다.

행렬의 곱셈

행렬의 곱셈은 두 개의 행렬을 곱하는 연산입니다. 이 곱셈은 두 행렬의 크기와 위치에 따라서 계산이 이루어집니다. 첫 번째 행렬의 각 행과 두 번째 행렬의 각 열을 곱하고 더하여 새로운 행렬의 각 원소를 계산합니다.

예를 들어, 다음과 같은 두 행렬을 생각해봅시다:

1
2
3
4
5
6
7
8
9
const A = [
  [1, 2],
  [3, 4]
];

const B = [
  [5, 6],
  [7, 8]
];

이 경우, 두 행렬을 곱셈하면 다음과 같습니다:

1
2
3
4
AB = [
  [1*5 + 2*7, 1*6 + 2*8],
  [3*5 + 4*7, 3*6 + 4*8]
];

따라서 결과는 다음과 같습니다:

1
2
3
4
AB = [
  [19, 22],
  [43, 50]
];

이러한 방식으로 행렬의 곱셈은 각 행렬의 행과 열을 곱하여 새로운 행렬을 만듭니다.

만약 곱할 수 없는 경우?

행렬의 곱셈을 수행하려면 첫 번째 행렬의 열 수와 두 번째 행렬의 행 수가 같아야 합니다. 그렇지 않으면 곱셈 연산을 할 수 없습니다. 만약 곱셈이 불가능한 경우에는 오류가 발생하거나 연산이 실패합니다.

따라서 행렬의 곱셈을 수행하기 전에 두 행렬의 크기를 확인하여 곱셈이 가능한지를 먼저 검사해야 합니다. 만약 두 행렬의 크기가 서로 다르다면, 곱셈을 수행할 수 없으므로 다른 방법을 사용해야 합니다.

이렇게 행렬과 행렬의 곱셈 방법을 알아보았습니다.

그럼 오늘 문제의 풀이를 코드로 한번 작성해 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function solution(arr1, arr2) {
  var answer = [];
  var n = arr1.length;
  var p = arr2[0].length;
  var m = arr2.length;
  for (var i = 0; i < n; i++) {
    answer.push([]);
  }
  for (var i = 0; i < n; i++) {
    for (var j = 0; j < p; j++) {
      var sum = 0;
      for (var k = 0; k < m; k++) {
        sum += arr1[i][k] * arr2[k][j];
      }
      answer[i].push(sum);
    }
  }
  
  return answer;
}

위 코드의 간단한 설명을 알려드리겠습니다.

  1. 먼저, 결과 행렬을 저장할 빈 배열 answer를 선언합니다.

  2. arr1의 행 수를 변수 n에 저장합니다.

  3. arr2의 열 수를 변수 p에 저장합니다.

  4. arr2의 행 수를 변수 m에 저장합니다.

  5. answer 배열에 n개의 빈 배열을 추가합니다. 이 배열은 나중에 결과 행렬의 행을 담을 것입니다.

  6. 첫 번째 반복문에서는 arr1의 행에 접근하고, 두 번째 반복문에서는 arr2의 열에 접근합니다.

  7. 세 번째 반복문에서는 두 행렬을 곱하여 결과 행렬의 각 요소를 계산합니다. 각 요소는 해당 행의 각 열에 있는 요소들을 곱하고 더한 값입니다.

  8. 결과 행렬의 각 행에 계산된 값을 추가합니다.

  9. 모든 계산이 끝나면 결과 행렬을 반환합니다.

그럼 코드를 프로그래머스에 한번 확인해보겠습니다.

프로그래머스 이미지

성공이네요!

오늘은 프로그래머스 LV2 ‘행렬의 곱셈’ 문제의 대해서 알아봤습니다.

제 방법이 꼭 정답은 아니니 그저 이런방법도 있구나하고 참고용으로만 봐주시면 감사하겠습니다.

감사합니다.

This post is licensed under CC BY 4.0 by the author.