알고리즘🅰/프로그래머스

[프로그래머스] 행렬의 덧셈

개발조각 2022. 3. 8. 22:54
728x90
반응형

 

행렬의 덧셈 문제는

arr1=[[a,b],[c,d]]

arr2=[[A,B],[C,D]]

return = [[a+A, b+B],[c+C, d+D]]

arr1, arr2의 같은 위치에 있는 원소 값을 더하면 됩니다.

 

이 문제는 풀다 보면 좀 헷갈려서 "테스트 케이스 추가하기"에서 아래 내용을 추가하시면 좋을 것 같아요.

arr1 : [[1, 2, 3, 4], [4, 5, 6, 7], [1, 2, 3, 3]]
arr2 : [[3, 2, 1, 5], [6, 5, 4, 9], [4, 5, 6, 7]]
answer : [[4, 4, 4, 9], [10, 10, 10, 16], [5, 7, 9, 10]]


해결방안

function solution(arr1, arr2) {
    var answer = [];
    let sum = [];
    
    for(let i=0; i<arr1.length; i++){
        for(let j=0; j<arr1[0].length; j++){
            let n = arr1[i][j] + arr2[i][j];
            sum.push(n);
        }
        answer.push(sum);
        sum = [];
    }
    return answer
}

var answer = []; : 행렬 덧셈한 후 나오는 값을 담을 배열

let sum = []; : 행렬 덧셈한 값을 담아주는 배열

 

어떻게 구하는지 설명하면

여기서 배열은 "행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행"이라 합니다.

이 말은 arr1, arr2의 배열이 안의 값만 다를 뿐 형태가 똑같은 배열이라는 소리입니다.

 

이러한 두 개의 배열이 있다고 하면

arr1=[[a,b],[c,d]]

arr2=[[A,B],[C,D]]

 

이렇게 행렬의 덧셈을 해주는 각각의 배열을 만들고 -> sum배열에 담을 거임

[a+A, b+B]

[c+C, d+D]

 

answer배열에다가 넣어주면 되겠죠?

[[a+A, b+B], [c+C, d+D]]

 

 

해결방안을 이해하기 위해

answer.push(sum);
sum = [];

이 두 개의 코드 줄을 뺀 상태에서의 코드를 설명하겠습니다.

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

먼저 2차원 배열을 각각 제어하기 위해 중첩 for문을 사용해 주었습니다.

첫 번째 for문 : for(let i=0; i<arr1.length; i++) -> 행의 길이만큼 반복

두 번째 for문 : for(let j=0; j<arr1[0].length; j++) -> 열의 길이만큼 반복

 

만약

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

이러한 배열이 있다면

 

첫 번째 for문에서는 3번을 반복하게 되고

두 번째 for문에서는 4번을 반복하게 됩니다.

 

중첩 for문안에 행과 열의 크기가 같은 두 행렬의 같은 행의 합을 구해주고 sum배열에 넣어주었습니다.

let n = arr1[i][j] + arr2[i][j];
sum.push(n);

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

for(let i=0; i<arr1.length; i++) -> i는 3번 반복(0, 1, 2)
for(let j=0; j<arr1[0].length; j++) -> j는 배열안에 배열의 원소가 4개씩 있음으로 4번 반복(0, 1, 2, 3)

let n = arr1[i][j] + arr2[i][j];
i = 0이면 j는 0, 1, 2, 3 반복
j=0 -> arr1[0][0] + arr2[0][0] -> 1+3 = 4
sum.push(n); -> sum.push(4); -> sum = [4]
j=1 -> arr1[0][1] + arr2[0][1] -> 2+2 = 4
sum.push(n); -> sum.push(4); -> sum = [4, 4]
j=2 -> arr1[0][2] + arr2[0][2] -> 3+1 = 4
sum.push(n); -> sum.push(4); -> sum = [4, 4, 4]
j=3 -> arr1[0][3] + arr2[0][3] -> 4+5 = 9
sum.push(n); -> sum.push(9); -> sum = [4, 4, 4, 9]

i = 1이면 j는 0, 1, 2, 3 반복
j=0 -> arr1[1][0] + arr2[1][0] -> 4+6 = 10
sum.push(n); -> sum.push(10); -> sum = [4, 4, 4, 9, 10]
j=1 -> arr1[1][1] + arr2[1][1] -> 5+5 = 10
sum.push(n); -> sum.push(10); -> sum = [4, 4, 4, 9, 10, 10]
j=2 -> arr1[1][2] + arr2[1][2] -> 6+4 = 10
sum.push(n); -> sum.push(10); -> sum = [4, 4, 4, 9, 10, 10, 10]
j=3 -> arr1[1][3] + arr2[1][3] -> 7+9 = 16
sum.push(n); -> sum.push(16); -> sum = [4, 4, 4, 9, 10, 10, 10, 16]

i = 2이면 j는 0, 1, 2, 3 반복
j=0 -> arr1[2][0] + arr2[2][0] -> 1+4 = 5
sum.push(n); -> sum.push(5); -> sum = [4, 4, 4, 9, 10, 10, 10, 16, 5]
j=1 -> arr1[2][1] + arr2[2][1] -> 2+5 = 7
sum.push(n); -> sum.push(7); -> sum = [4, 4, 4, 9, 10, 10, 10, 16, 5, 7]
j=2 -> arr1[2][2] + arr2[2][2] -> 3+6 = 9
sum.push(n); -> sum.push(9); -> sum = [4, 4, 4, 9, 10, 10, 10, 16,5, 7, 9]
j=3 -> arr1[2][3] + arr2[2][3] -> 3+7 = 10
sum.push(n); -> sum.push(16); -> sum = [4, 4, 4, 9, 10, 10, 10, 16,​ 5, 7, 9, 10]

sum = [4, 4, 4, 9, 10, 10, 10, 16, 5, 7, 9, 10]

 

여기서 원하는 값은

sum = [4, 4, 4, 9, 10]

sum = [10, 10, 10, 16​]

sum = [5, 7, 9, 10​]

이렇게 받아서 배열인 상태로 합치는 걸 원하는 거잖아요?

 

그래서 그 과정을 for문안에서 제어해야 됩니다.

두 번째 for문을 다 돌린 다음에

​answer.push(sum);
sum = [];​​

을 넣어주어야 됩니다.

 

여기서 sum = [];을 꼭 넣어주어야 됩니다.

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

중첩 for문 진행
i = 0, j는 0, 1, 2, 3 반복하면 sum = [4, 4, 4, 9]
​answer.push(sum); -> answer = [ [4, 4, 4, 9] ]
sum = [];​​ : 빈 배열로 바꾸기

i = 1, j는 0, 1, 2, 3 반복하면 sum = [10, 10, 10, 16]
​answer.push(sum); -> answer = [ [4, 4, 4, 9], [10, 10, 10, 16] ]
sum = [];​​ : 빈 배열로 바꾸기

i = 1, j는 0, 1, 2, 3 반복하면 
sum = [5, 7, 9, 10​]
​answer.push(sum); -> answer = [ [4, 4, 4, 9], [10, 10, 10, 16] , [5, 7, 9, 10]]

answer = [ [4, 4, 4, 9], [10, 10, 10, 16] , [5, 7, 9, 10]]

여기까지 프로그래머스 행렬의 덧셈 해결방안에 대해 설명해보았습니다.

728x90
반응형