ALGORITHM/PROGRAMMERS

[프로그래머스] 행렬의 곱셈 | javascript

heeney 2021. 8. 20. 22:33
728x90

[프로그래머스] 행렬의 곱셈 | javascript

문제 설명

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

입출력 예

arr1 arr2 return
[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

작성한 코드

function solution(a, b) {
    let answer = [];
    
    for(let i=0; i<a.length; i++) {
        let arr = a[i];
        answer.push([]);
        for(let j=0; j<b[0].length; j++) {
            let sum = 0;
            for(let z=0; z<b.length; z++) {
                sum += arr[z]*b[z][j];
            }
            answer[i].push(sum);
        }
    }
    
    return answer;
}

고통 안겨준 멋진 문제..... ^^... (핼쑥)

우선 행렬의 곱셈을 알아야한다. 설명이 잘 되어있는 링크에서 도움을 받았다.

삼중for문으로 문제를 풀었다. 혼자 끄적끄적 종이에 행렬의 곱셈을 시도하면서 패턴을 찾았다. 정말 찾으면서도 헷갈려서 혼났다.
이해를 제대로 못한건지 프로그래밍 언어로 구현하는게 어렵게 느껴져 구글링했다 ㅠㅠ

  1. answer이라는 빈 배열을 만들어준다.
  2. 삼중for문을 돌리는데,
    i = 고정시킬 a의 행 / j = 고정시킬 b의 열 / z = a의 행에서 각 인덱스 접근, b의 열 고정해두고 행이 변하여 접근하도록 함
  3. z 반복문에서 sum에 행렬의 곱셈대로 곱한 수를 더해준다.

 

** for문의 조건을 적을때 a.length는 그렇다 쳐도 왜 b.length / b[0].length가 달라야할까?

🔑 행렬 곱셈을 위해선 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일해야한다. 

j의 조건이 b[0].length인 이유는 저 두개만 동일하면 행렬의 곱셈을 시도할 수 있다는 뜻이고 그건 b의 열이 여러개일 수 있다는 뜻으로도 이해할 수 있다. 각 j의 열에 접근해 계산하려면 b[0]의 갯수를 알아야 그때까지 접근하여 반복문을 돌 수 있다.

z의 조건이 b.length인 이유는 코드를 자세히 살펴보면 금방 알 수 있다.
b.length는 b의 행 갯수이다. z가 어디서 얼만큼 움직이면 되는지를 보면 알 수 있다.
위에서 설명했다시피 행렬 곱셈은 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일하다. 그래서 a[0].length로 입력해주어도 된다.
a 각 행의 요소들을 한번씩 접근해 곱해주고 그 수들을 더해주어야(sum) 하는 거라서 a[0].length 혹은 b.length를 조건으로 걸어주는 것이 필요하다.

 


힘들었다..... level2는 정말 나에게 버겁지만 1단계때도 버거운 문제는 항상 있었고 그걸 쉽게 풀게 되면서 1단계를 모두 끝냈었다. 2단계 또한 그렇게 꾸준히 하다보면 하나하나 서서히 문제가 쉽게 풀리게 되리라 믿는다. 한 문제 이해하는데 드는 시간과 노력이 너무 많이 들어 속상하기도 하지만 ㅠㅠㅠ 이해가 느린걸 어떡하나!!! 그냥 이해 될때까지 할 뿐이다.... 화이팅

 

728x90