개발/코딩테스트

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

prpn97 2023. 4. 29. 22:31

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

<문제 풀이>

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

문제의 핵심은 배열 안에 배열이 있는, 배열의 요소가 다시 배열인 구조이다.

그래서 반복문을 어떻게 설정할 것인가 구상하는 것이 중요하다고 생각했다. 

반복문을 중첩하는데, 하나는 arr1 전체를 돌아서 [[1,2],[2,3]] 에서 1,2 / 2,3 이렇게 돌고,

그 안에서는 1,2 에서 1 / 2 이렇게 돈다. 

그래서 빈 배열인 temp에 arr1[i][j]+ arr2[i][j]를 넣어준다. 

 

예시로 넣어보면, arr1[0][0] + arr2[0][0]은

arr1인 [[1,2],[2,3]]에서 0번째 인덱스의 0번째 값인 1, 

arr2인 [[3,4],[5,6]]에서 0번째 인덱스의 0번째 값인 3을 더한다. 

이런식으로 i,j 값이 증가하면서 4,6,7,9 가 temp에 담긴다.

우리가 원하는 결과는 [4,6,7,9]가 아니라 [4,6],[7,9]를 배열에 담는 것이다.

 

다시 새로운 반복문에 temp의 길이만큼 즉, [4,6,7,9]를 돌면서

해당 요소를 기존 arr1의 0번째 인덱스([1,2])의 크기에 맞게 넣으면서 배열이 완성되면

빈 배열에 그 배열을 넣는 방식으로 구했다.

그렇게 되면[] 안에 []이 들어가면서 [[],[]]이런 형식이 되는 것이다. 

4,6,7,9가 배열 안에 들어갈텐데, arr1의 0번째 인덱스의 크기는 2이다.

그럼 4,6이 들어가면 배열이 채워지므로 answer에 [4,6]을 담으면서

동시에 result에 있던 [4,6]은 초기화한다. 

그리고 4,6은 이미 돌았기 때문에 7,9가 비어진 result에 들어가면서 result[7,9]가 되고,

다시 result는 answer에 들어가기 때문에 [[4,6],[7,9]]가 완성된다. 

 

간단하게 답을 구한 방법을 요약하면, 숫자를 어떻게든 결과에 맞게 만들고,

배열의 형식에 맞추어서 새 배열에 만든 배열을 넣는 동시에,

기존 배열의 값을 비워서 다시 새롭게 만든 배열을 넣는 것을 반복하는 것이다. 

1,2,3,4에서 1,2를 먼저 배열에 넣고 보내고, 초기화하지 않으면 3,4만 들어가야 하는데

1,2,3,4만 들어가기 때문에 초기화를 해주어야 한다. 

 

<코멘트>

머릿속에 방법은 진작 떠올랐는데, 중첩해서 머리쓰기 싫고,

초기화하는 로직을 생각하기 싫어서 이게 방법인걸 알면서도 외면하고

직접 더해서 나눌 방법을 찾다가 떠오르지 않아서 처음 생각한 방법대로 시도하다가

문제는 풀었는데, 괜히 잔머리쓰다가 오래걸렸다. 어차피 공부하는 겸,

구상했던 그대로를 표현하는 것이 중요한 것 같아서,

어렵더라도 뭐든 다 할 수 있어야 한다는 마음으로 해야겠다. 

 

 

728x90