본문 바로가기
코딩테스트

(javascript)행렬의 덧셈

by 어뇨 2024. 1. 22.
  • 문제 설명

    행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
  • 제한 조건

    행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

 

문제 풀이.

 

function solution(arr1, arr2) {
    var answer = [];
    for(let i = 0 ; i < arr1.length ; i++){
       // answer.push([arr1[i]*1+ arr2[i]*1])
        num = []
    for(let j= 0 ; j < arr1[i].length ; j++){
        num.push(arr1[i][j] +arr2[i][j])
    }
        answer.push(num)
    }


    return answer;
}

 

어찌보면 간단하고 어찌보면 어려웠다. 

우선 예시를 보면 배열안에 또 배열로 묶여져있다는걸 알수있다. 
그렇기때문에 for문을 돌리고 push를 할때 배열에 첫 배열에 넣고 그리고 그 첫 배열을 answer에 push해야 겠다 라고 생각을 하고 시작했다. 

for문이 외부, 내부 for문 즉 for문을 중첩해서 사용했는데

외부 for문(바깥쪽 for문)은 바깥쪽 배열 예를들면 arr1 의 배열 [[1,2 ], [2, 3]] 의 [1, 2]와 [2, 3]을 요소로 가진 길이가 2인 배열을 의미하고,

내부 for문(안쪽 for문)은 안쪽 배열  [[1,2 ], [2, 3]] 에서 arr1 의 i번째 인덱스값 [1, 2] 또는 [2, 3]의 j번째 인덱스 값 (i와 j가 0이라면 [1, 2]의 1 )
이런식으로 for문을 통해 반복을 하게끔 했다.


다른사람의 풀이.

function sumMatrix(A,B){
    return A.map((arr1, idx1) => arr1.map((val, idx2) => val+B[idx1][idx2]));
}


map을 두번 쓰는건 생각을 못했다. 우선 보면 A를 map함수를 써서 매게변수로 arr1, idx1을 두고 복제, arr1을 또 map함수를 써서 매게변후론 val, idx2 를쓰고 복제한 값에 val + B[idx1][idx2] 

예를들어 arr1이 [[1,2],[3,4]] 고 arr2 가 [[3, 4],[5, 6]]이면 arr1을 맵핑을 시작한다. 그러면 첫번째 인자로 v= [1,2] 인덱스는 0,

이 상태에서 다시한번 맵핑을 하면 v2 = 1 , 두번째 인덱스로 0이 추가가 된다. 이때 두번째 인덱스는 [1,2]만큼 돌기 때문에

1까지 커진다. 
arr1.map((v, i) => v.map((v2, j) => v2 + arr2[i][j])); 되는거에요. 첫 맵핑에 4,6이 나올겁니다. j가 1까지 커졌으니 다시 arr1의 두번째 맵핑을 합니다.