본문 바로가기
알고리즘

[항해99][프로그래머스] 행렬의 덧셈 in Javascript

by lucian 2022. 7. 15.

문제 설명

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

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예
arr1 arr2 return
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]
[[1],[2]] [[3],[4]] [[4],[6]]

 


내가 푼 풀이

function solution(arr1, arr2) {
    return arr1.map((row,i) => arr2[i].map((col,j) => arr1[i][j]+arr2[i][j]))
}

우선 행렬의 덧셈이고 같은 크기의 배열 덧셈이기 때문에 이중 for문을 쓰기가 싫었다.

늘 하던 방식으로 말고 함수로 구현하겠다 싶어서 map함수를 사용하게 되었다.

 

map()함수는 행렬의 요소 요소에게 함수의 기능을 전달하는 함수이다.

예를 들어, 행렬의 요소들마다 *2를 하고 싶다면 우린 for문을 돌려서 실행을 해야 한다.

이를 방지해주는 것이 이 map()함수이다.

 

map()함수

https://velog.io/@daybreak/Javascript-map%ED%95%A8%EC%88%98

 

[Javascript] map함수

map함수는 callbackFunction을 실행한 결과를 가지고 새로운 배열을 만들 때 사용한다. array.map(callbackFunction(currenValue, index, array), thisArg)filter, forEach와 같은 구문이다.

velog.io

 

그렇기에 요소마다 다른 배열의 요소를 더해주는 것에는 이 map함수가 최적이다.(why? 요소마다 각 배열들을 더해주니깐 게다가 index값도 가져올 수 있다.)

 

먼저 i 는 행(rows)를 j는 열(cols)를 나타낸다.

예를 들자, 첫번째 예제에서

arr1 arr2 return
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]

 1. arr1.map이 첫번째 돌아가면 i=0이 되고 row=[1,2]가 된다. 

     1) i=0일 때, arr2[i].map이 첫번째로 돌아가면 j=0이 되고, arr1[0][0]+arr2[0][0]=4 이 된다.

     2) i=0일 때, arr2[i].map이 두번째로 돌아가면 j=1이 되고, arr1[0][1]+arr2[0][1]=6 이 된다.

    ( arr2[0].map이 끝나고 arr1.map의 루틴으로 돌아간다.)

2. arr1.map이 두번째로 돌아가면 i=1이 된다.

    1) i=1일 때, arr2[i].map이 첫번쨰로 돌아가고 j=0이 된다. arr[1][0]+arr2[1][0]=7

    2) i=1일 때, arr2[i].map이 두번째로 돌아가고 j=1이 된다. arr[1][1]+arr2[1][1]=9

   ( arr2[1].map이 끝나고 arr1.map의 루틴으로 돌아간다.)

(arr1.map의 루틴이 끝나고 값을 return해준다.)

 

 

 


남이 푼 풀이

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][j]=arr1[i][j]+arr2[i][j]
        }
    }
    return answer
}

전형적인 for문이다. for문(row) 중간에 answer[i]=[]을 넣어줬다.

2줄에서 answer을 선언했을 때 안에 배열을 만들지 않았기에 새로운 row가 나올 때마다 빈 배열을 선언해줘야한다.

만약 answer[0][0]=1을 넣고 싶은데 answer배열은 1차원 배열이라면 오류가 뜨기에 answer[i][]를 만들어 준 것.

 

 

남이 푼 풀이

function solution(arr1, arr2) {
    return arr1.map((row,i) => row.map((col,j) => col+arr2[i][j]))
}

먼저 내 코드보다 이 코드가 훨씬 좋다...ㅋㅋㅋ

arr1.map으로 row를 불러내서 arr2[i] 대신 row를 써줬다. 쓰라고 함수가 알려주는데 쓰지 못했다....ㅎㅎ

row는 현재 row=arr1[0]이다.

이 상태에서 다시 row.map을 불르면 col은 arr1[0][0]=row[0]=col이 된다.

여기서 col+arr2[i][j]만 해주면 끝이다.

댓글