Algorithm

[알고리즘] 행렬의 덧셈

montmer27 2026. 2. 3. 09:54

문제 요구사항

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

제한 조건

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

풀이

import java.util.*;

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int length = arr1.length;
        int[][] answer = new int[length][length];
        for(int i = 0;i<length;i++){
            for(int j = 0;j<length;j++){
                answer[i][j] = arr1[i][j] + arr2[i][j];
            }
        }
        return answer;
    }
}

//결과
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
	at Solution.solution(Unknown Source)
	at SolutionTest.lambda$main$0(Unknown Source)
	at SolutionTest$SolutionRunner.run(Unknown Source)
	at SolutionTest.main(Unknown Source)
테스트 결과 (~˘▾˘)~
2개 중 1개 성공

예상 실패 요인(정답 확인 전)

1개 케이스에선 성공한 것을 보니 메모리 재할당이 안 되는 듯. 근데 왜 안되는지는 잘 모르겠다

실제 실패 요인(정답 확인 후)

행과 열의 길이가 같다는 전제가 있어 answer를 초기화할 때 arr1.length로 동일하게 초기화했는데, 여기서 문제가 발생한 모양이다.

다른 풀이를 보니 answer의 행은 arr1.length로, 열은 arr1[0].length로 초기화했다.

다시 생각해 보니 두 행렬의 행과 열의 길이가 같다는 말은 행은 행끼리, 열은 열끼리 길이가 같다는 의미였다!

 

두번째 테스트 케이스를 예로 들자면, [[1], [2]], [[2], [3]] 두 행렬이 주어졌다고 하자.

각 행렬은 행의 길이가 2이고, 열의 길이가 1이다. 한 행렬 내에서 행과 열의 길이는 다르지만, 두 행렬은 서로 행과 열의 길이가 동일하다. 

모범답안

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
    	//핵심: 행과 열의 길이는 서로 다를 수 있다.
        int[][] answer = new int[arr1.length][arr1[0].length];
        
        for (int i = 0;i < arr1.length;i++) {
            for (int j = 0;j < arr1[i].length;j++) {
                answer[i][j] = arr1[i][j] + arr2[i][j];
            }
        }
        
        return answer;

    }
}

 

스트림으로 푸는 법도 있었는데, 중첩 스트림 방식이라 가독성은 배열보다 떨어지는 듯했다.

class Solution {

    public int[][] solution(int[][] arr1, int[][] arr2) {
        return IntStream.range(0, arr1.length)
                        .mapToObj(i -> IntStream.range(0, arr1[i].length)
                                                .map(j -> arr1[i][j] + arr2[i][j])
                                                .toArray()) // int[]: 한 행의 덧셈 결과
                        .toArray(int[][]::new); // int[][]: 전체 행렬로 반환
    }
}

 

잘한 점

처음엔 빈 배열{}로 선언된 answer를 더 유연한 자료구조인 리스트로 만드려고 했는데, 이후 다시 2차원 배열로 만드는 과정이 복잡하다고 생각하여 answer를 처음부터 arr1의 행렬 길이를 받아 초기화하였다.

결과적으로 코드가 간결해지고 가독성이 높아졌다.

인사이트

사고방식의 유연함을 길러야 한다. 쉬운 듯한 문제가 안 풀린다면 문해력이 부족한 것일수도 있다.
배열의 길이는 변수로 초기화할 수 있다.
중첩 스트림도 가능하니 연습해봐야 한다.

Github 링크

https://github.com/ginsengcandy/Coding-Test-Practice/commit/e4e060be31583f765b0691f876603828771c6da0

 

[level 1] Title: 행렬의 덧셈, Time: 7.67 ms, Memory: 124 MB -BaekjoonHub · ginsengcandy/Coding-Test-Practice@e4e060b

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

github.com

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/12950

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr