Programmers / 행렬의 덧셈 - 12950

y1nlog·2025년 1월 6일
0

[level 1] 행렬의 덧셈 - 12950

문제 링크

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2025년 01월 06일 09:55:44

문제 설명

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

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
입출력 예
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) {
    var answer = [[]];
    for(let i=0;i<arr1.length;i++){
        answer[i] = [];
        for (let j=0;j<arr1[i].length;j++){
            let a = arr1[i][j];
            let b = arr2[i][j];
            let temp = a+b;
            answer[i][j] = temp;
        }
    }
    return answer;
}
  • answer 식별자 - 빈 배열 할당하기
  • 반복문 - 2중 for문 이용
	- 첫번째 배열의 길이만큼 반복-> 최대 500번 돌 수 있다.
    - 2번째 depth의 반복문에서 1번째 반복문에서 가져온 i번째 원소의 길이만큼 반복
    - arr1과 arr2의 idx=0번째 원소부터 시작해 순서대로 arr1[0][0]~...
    모든 요소를 가져와 temporary variable로 사용할 a, b에 담아 temp에 합한다.
   - 다음 인덱스로 넘어가기 전에 answer의 정해진 인덱스- 기존에 사용했던 i,j를 기준으로 합계 저장
   - 반복문 끝나면 answer 리턴

성능 요약

메모리: 67.2 MB, 시간: 8.70 ms

노트

  • 시간도 시간이고, 메모리 사용량도 평시대비 2배가까이 되는 것을 볼 수 있었다.
  • 성능개선을 어떻게 하면 좋을지 떠오르는 게 없어서, AI 도움을 받아보자.
function solution(arr1, arr2) {
    const answer = new Array(arr1.length); // 미리 배열 크기를 할당합니다.
    
    for (let i = 0; i < arr1.length; i++) {
        answer[i] = new Array(arr1[i].length); // 내부 배열도 미리 할당
        for (let j = 0; j < arr1[i].length; j++) {
            answer[i][j] = arr1[i][j] + arr2[i][j]; // 불필요한 변수 할당 제거
        }
    }
    
    return answer;
}
  • 재주는 AI가 부리고, 코드리뷰는 사람이 한다.
  • const answer : 새로운 배열 할당 및, 길이를 지정해줄 수 있다.
    세상에... Array 길이 지정하는 것도 까먹고 있었다.
  • 반복문 사용은 역시 2중으로 하게 된다. 내가 Input 코드를 애초에 2중 for문으로 넣어서 그런진 몰라도..
  • answer[i] = new Array(길이) : 큰 배열(?)외에 안에 담을 배열도, 길이 지정
  • 2중 for문 안에서 각 위치별로 합계를 구해, answer 배열의 동일한 위치(i,j)에 할당.
 - 비교해 보자면, 내 코드는 불필요한 변수할당, a, b...가 눈에 띄네 ㅠㅠ 누네띠네 먹고싶다.
 
 

여기서 궁금증.
map을 이용하는 방법은 없을까?

function solution(arr1, arr2) {
    return arr1.map((row, i) => 
        row.map((value, j) => value + arr2[i][j])
    );
}
아니나 다를까, 아는 만큼, input 넣은 만큼 나온다고
map으로 하니까 훨씬 나아지잖아...
코드 길이 너무 짧고 혁명적이야.... 사랑해
  • 그냥 냅다 return 나와버리고?
  • arr1에 map. 파라미터로는 row, i 오시겠다.
    그래서 arr1의 각 행을 순회할 것
  • row.map() : 각 행에 대해서도 똑같이 순회를 해 주겠다.
  • 두번째 map을 돌면서는 각 열의 값 = value랑 arr2의 동일한 인덱스 값을 불러와 합한다.
  • 그리고 믿었던 map. 배열을 리턴해주니 여기서 끝 ㅠㅠ

성능 요약 비교

2중 for문

메모리: 67.2 MB, 시간: 8.70 ms

2중 map

메모리: 67.3 MB, 시간: 8.13 ms

  • 사실 성능면에서는 큰 차이가 없었지만, 그래도 코드 짜는 사람입장에서는 Map만 쓰는 게 좀 더 간단하고 좋은 듯......
profile
FrontEnd Developer

0개의 댓글