[프로그래머스 Lv1] 행렬의 덧셈 - (Javascript)

eeeyooon·2023년 12월 21일
0

행렬의 덧셈

문제 링크

📩 문제 설명

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

제한사항

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

입출력 예

arr1arr2return
[[1,2],[2,3]][[3,4],[5,6]][[4,6],[7,9]]
[[1],[2]][[3],[4]][[4],[6]]

제출 답안

function solution(arr1, arr2) {
   let answer = [[]];

    for (let i=0; i<arr1.length; i++){
        answer[i] = [];
        for (let j=0; j<arr1[i].length; j++){
            answer[i].push(arr1[i][j] + arr2[i][j])
        }
    }
    
    return answer;
}

답안 설명

가장 먼저 중첩 for문이 떠올라서 중첩for문으로 코드를 작성하였다.

function solution(arr1, arr2) {
  
   let answer = [[]];

    for (let i=0; i<arr1.length; i++){
        //arr1의 길이만큼 answer 안에 있는 배열 생성
      	answer[i] = [];
        for (let j=0; j<arr1[i].length; j++){
            // i. answer[0]에다가  arr1[0][0] + arr2[0][0] push
			// ii. answer[0]에다가 arr1[0][1] + arr2[0][1] push
          	// => answer[0]은 [4,6] 현재 answer은 [[4,6]]
          	// 만약 answer[1]이 존재한다면 위와 같은 과정 반복
          	//answer[1]에다가 arr1[
            answer[i].push(arr1[i][j] + arr2[i][j])
        }
    }
    
    return answer;
}

다른 사람의 풀이

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

ㄴ 예를 들어 arr1 = [[1,2],[2,3]]이고, arr2 = [[3,4],[5,6]]일 때 arr1을 맵핑을 시작합니다(같은 크기라 누구한테 맵핑해도 상관없음). arr1을 맵핑을 하면 첫 번째 인자로 v = [1,2]가 올거에요. 그리고 인덱스는 i = 0인 상태입니다. 이 상태에서 [1,2]을 다시 맵핑합니다 그 이유는 [1,2]의 인덱스 값을 써야하기 때문이에요. 아무튼 [1,2]를 맵핑하면 v= [1,2], i = 0인 상태에 새로운 v2= 1, 인덱스 j = 0이 추가됩니다. 여기서 j는 [1,2]의 인덱스 만큼 돌기 때문에 j = 1까지 커질 수 있습니다. 그래서 최종 코드가 arr1.map((v, i) => v.map((v2, j) => v2 + arr2[i][j])); 되는거에요. 첫 맵핑에 4,6이 나올겁니다. j가 1까지 커졌으니 다시 arr1의 두번째 맵핑을 합니다. [2,3]이겠죠? [2,3]을 위의 풀이를 반복합니다 (프로그래머스 원종건님 설명)

map을 쓸 수 있는 방법을 고민해봐도 떠오르지 않았는데 map을 두번 쓸 수 있는 방법은 생각지도 못했다. map의 인자로 map이 가능하다는 것도 처음 알았다. 하지만 아직 낯선 방법이라 다음에 혼자 쓸 수 있을지는 모르겠다.


0개의 댓글