행렬의 덧셈 | 프로그래머스

Wonkook Lee·2021년 7월 26일
1

JS Coding Test | Level 1

목록 보기
3/20
post-thumbnail

할 수 있는 최대한 단순한 코드를 만들기, 목표를 위해 다양한 방법을 사용해보기

문제 풀러 가기

행렬의 덧셈 (Lv.1)


문제

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 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]]

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[바깥배열의 인덱스][내부배열의 인덱스];

풀이

풀이 (1) : Nested map method

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)
내부 배열을 순회하여 값을 더하고, 외부 배열을 순회하며 덧셈을 수행한다.

풀이 (2) : Nested for Loop

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;
}

표현은 다르지만 같은 맥락이다

profile
© 가치 지향 프론트엔드 개발자

0개의 댓글