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

행렬의 덧셈 문제는
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]]
여기까지 프로그래머스 행렬의 덧셈 해결방안에 대해 설명해보았습니다.