Programmers coding challenge 3 : 행렬 덧셈

Minhyeok Kim·2022년 8월 8일
0

알고리즘(Algorithm)

목록 보기
3/5

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

Given condition,
행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

주어진 코드의 의미를 파악해 보자

function solution(arr1, arr2) {
  var answer = [[]];
  return answer;
}
// Solution 이라는 함수는 배열을 매개변수로 받아서 answer 를 반환한다.

여기서 드는 생각은, Js로 행렬을 만들 수 있나 ??
바로 구글링 ㄱㄱ

초기값을 할당하여 배열을 생성하는 방법

// arr[3][2]
var arr = [
  [a, b],
  [c, d],
  [e, f],
];
// 3행 2열의 형태를 가진 배열을 생성하는 방법
// arr[5][2]
var arr = new Array(5);
for (var i = 0; i < arr.length; i++) {
  arr[i] = new Array(2);
}
// 반복문을 사용하여 빈 배열을 생성하는 방법
/*
여기서는 5개의 요소를 가지는 빈 배열을 생성하고, 반복문을 사용하여
첫 배열의 인덱스 수 만큼 2개의 요소를 가지는 또 다른 새배열을 생성하여
인덱스를 매개로 인수로 집어넣어
*/
function create2DArray(rows, columns) {
  var arr = new Array(rows);
  for (var i = 0; i < rows; i++) {
    arr[i] = new Array(columns);
  }
  return arr;
}

var arr = create2DArray(5, 2);
// 2차원 배열 생성함수를 만들어서 사용
/*
rows 와 columns 를 매개변수로 받는 함수 create2DArray를 생성하는데
함수 안에서 새 배열을 하나 정의하고(행), 
안에 반복문을 사용해서 행의 역할을 하는 배열안에다가 
열의 역할을 하는 또 다른 배열을 생성하여 리턴하는 함수로 만든다.
그리고 함수를 호출하는 식에 원하는 행과 열의 수를 집어넣어서 호출
*/
Array.matrix = function (m, n, initial) {
  var a,
    i,
    j,
    mat = [];
  for (i = 0; i < m; i += 1) {
    a = [];
    for (j = 0; j < n; j += 1) {
      a[j] = initial;
    }
    mat[i] = a;
  }
  return mat;
};
// matrix('행','열','기본값')
var arr = Array.matrix(5, 2, 0);
// Array 객체에 배열 생성 함수를 추가하여 사용
/*
사실 메서드 matrix에 대한 data를 잘 찾지 못했다... 
특히 한국어로 되어 있는 자료가 많이 부족한 느낌이었다. 
그래서 영어로 되어 있는 부분을 찾아봤는데, 
"A lightweight and performant data structure 
for storing JavaScript objects 
in an n-way or n-order array matrix" 라고 하더라. 
말 그대로 매트릭스(==차원)을 생성하는 메서드라고 한다.
매개변수로 3개를 받아서 이중 for 문을 이용하여 배열을 생성하고
inner for문에서 요소 배열을 만들어 outer 배열로 집어 넣는
방식으로 2차원 배열을 만드는 방법이다. 
*/
// arr [5][2] (빈 배열 생성)
const arr1 = Array.from(Array(5), () => new Array(2));

// arr [5][2] (null로 초기화하여 생성)
const arr2 = Array.from(Array(5), () => Array(2).fill(null));
// ES6 를 지원하는 최신 브라우저에서 사용 가능한 방법
/*
배열 from 메서드와 화살표함수를 이용해서 생성된 객체에 
요소를 집어넣는 방식으로 2차원 배열을 생성 
(아래 Syntax 를 참고하면 이해하기 쉬움)
*/

Array.from Syntax

resource : https://gent.tistory.com/296
그리고 다른 사이트들...

여기서 내가 이해하기 가장 쉽고 활용하기 편했던 방법은 3번째 방법인 함수를 생성해서 2차배열을 만드는 방식이있다. 어차피 주어진 코드도 함수를 이용하는 방식이었기 때문에 바로 적용해보자.

나의 풀이

function solution(arr1, arr2) {
  var answer = [];
  // 행렬이 만들어 짐 answer 안에서는 값이 더해진게 들어가서 return이 되어야 함
  for (let i = 0; i < arr1.length; i++) {
    ready = arr1[i];
    ready2 = arr2[i];
    let result = [];
    for (let j = 0; j < ready.length; j++) {
      result.push(ready[j] + ready2[j]);
    }
    answer.push(result);
  }
  console.log(answer);
  return answer;
}
/*
먼저 행렬을 더하려면 안에 배열끼리 더해지는게 아닌
값들끼리 더해질 수 있도록 배열을 까려고 했다.
그래서 배열의 인덱스를 이용해서 값들을 빼서 더한 다음 (행의 수만큼)
그 값을 빈 배열에 넣어주고 그 배열을 answer에 넣는걸 반복
*/

다른사람 풀이

// 1번풀이
// 문제가 개편되었습니다. 
// 이로 인해 함수 구성이나 테스트케이스가 변경되어, 
// 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 
// 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function sumMatrix(A, B) {
  /*var answer = Array();
  var rowMax = A.length > B.length ? A.length : B.length;
  var colMax = A[0].length > B[0].length ? A[0].length : B[0].length;
    for(var i=0; i < rowMax; i++)
  {
    answer[i] = new Array();
    for(var j=0; j < colMax; j++)
    {
      console.log(isNaN(A[i][j])?0:A[i][j]);
      console.log(isNaN(B[i][j])?0:B[i][j]);
            answer[i][j] = 
            parseInt(isNaN(A[i][j])?0:A[i][j]) 
            + parseInt(isNaN(B[i][j])?0:B[i][j]);
    }
  }*/
  return A.map((a, i) => a.map((b, j) => b + B[i][j]));
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log(
  sumMatrix(
    [
      [1, 2],
      [2, 3],
    ],
    [
      [3, 4],
      [5, 6],
    ]
  )
);
// 솔직히 아직 이해 안감

// 2번 풀이
function solution(arr1, arr2) {
  var answer = [[]];
  for (var i = 0; i < arr1.length; i++) {
    answer[i] = [];
    for (var j = 0; j < arr1[i].length; j++) {
      answer[i].push(arr1[i][j] + arr2[i][j]);
    }
  }
  return answer;
}
/* answer[i] 이라는 배열을 생성하고, 이를 이용해서
마치 행렬의 덧셈처럼 1,1 / 1,2 / 2,1 / 2,2 를 만들어 더한뒤
인덱스var answer = [[]]; i 를 기준으로 배열을 push

분명 시작할때 [][] 이거 안돼! 했는데 갑자기 돼*/
  var answer = [[]];
  for (var i = 0; i < arr1.length; i++) {
    answer[i] = [];
/*
이렇게 선언되면 된다는데... 아직은 이렇게 접근하기 너무 막막함
*/

0개의 댓글