할 수 있는 최대한 단순한 코드를 만들기, 목표를 위해 다양한 방법을 사용해보기
행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
arr1 | arr2 | return |
---|---|---|
[[1,2],[2,3]] | [[3,4],[5,6]] | [[4,6],[7,9]] |
[[1],[2]] | [[3],[4]] | [[4],[6]] |
solution.js
function solution(arr1, arr2) {
var answer = [[]];
return answer;
}
중첩된 배열 속 값을 순서대로 더하기 위해선, 외부 배열을 도는 루프 + 내부 배열을 도는 루프를 만들어 각 인덱스의 값을 더해야 한다.
const arr = [["A", "B"],["C", "D"],["E", "F"]];
console.log(arr[0][1]); // B
console.log(arr[1][1]); // D
Braket Notation을 연속으로 사용하면 중첩된 배열 속 값에 접근할 수 있는 것을 알 수 있었다.
arr[바깥배열의 인덱스][내부배열의 인덱스];
function solution(arr1, arr2) {
const foo = arr1.map((e, i) => e.map((f, j) => f + arr2[i][j]));
return foo;
};
입력된 배열과 같은 구조의 배열을 반환, 배열을 순환하며 값을 연산하는 map 메소드가 떠올랐다.
첫번째 map에서 인자로 전달된 e는 내부 배열을 의미하며, e.map으로 내부 배열의 각 인덱스별 값에 순차적으로 접근할 수 있었다. (외부 인덱스 = i, 내부 인덱스 =j)
내부 배열을 순회하여 값을 더하고, 외부 배열을 순회하며 덧셈을 수행한다.
function solution(arr1, arr2) {
let outer = [];
for (let i = 0; i < arr1.length; i++) {
let inner = [];
for (let j = 0; j < arr1[i].length; j++) {
inner.push(arr1[i][j] + arr2[i][j]);
}
outer.push(inner);
}
return outer;
}
map에 비해 간결하진 않지만 for 반복문으로도 문제를 해결할 수 있다.
inner 배열에 합쳐진 값이 순차적으로 추가된 후, 완성된 inner 배열을 다시 outer 배열에 순차적으로 추가하여 결과를 리턴하는 풀이 방법이다.
function sumMatrix(A,B){
return A.map((a,i) => a.map((b, j) => b + B[i][j]));
}
console.log(sumMatrix([[1,2], [2,3]], [[3,4],[5,6]]))
마찬가지로 map을 사용한 문제 풀이. 계산된 배열을 따로 변수에 할당하지 않고 바로 리턴해서 더욱 간결하다.
function sumMatrix(A,B){
var answer;
answer = A.map((a, i) => {
return a.map((val, idx) => {
val += B[i][idx];
return val;
})
})
return answer;
}
표현은 다르지만 같은 맥락이다