프로그래머스 행렬의 덧셈 (99클럽 코딩테스트 7일차 TIL)

KIMYEONGJUN·2024년 4월 3일
0
post-thumbnail

목표

오늘 문제는 행렬의 덧셈이다. 이번 기회에 행렬을 공부할 기회가 있어서 다행인것같다.
이런 쉬운 문제는 안나오겠지만 공부해두면 행렬을 이해하기 조금더 수월하게 이해할 수 있을것같다.

문제

// 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과
// 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환

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

코드를 이렇게 작성한 이유는

가독성과 재사용을 위해서이다.
변수명을 rowLen, colLen 과 같이 의미 있게 지정하고 반복 로직을 함수 밖으로 빼내 재사용 가능하게했다.

성능적인면에서는
행렬 크기만큼 미리 answer 배열 할당 -> 불필요한 재할당 방지했고, arr1을 기준으로 연산 -> 불필요한 배열 순회 최소화했다.

확장성면에서는
행렬 크기 계산 로직 분리 -> 행렬 크기 동적 변경 시 수정 용이하게했다.

OOP 원칙 따라서 한 가지 역할(행렬 덧셈)만 담당하는 작은 메소드 작성하고 메소드 이름으로 기능 설명 -> 추가 주석 없이도 이해 가능하게 작성하였다.

시간복잡도는 O(N^2) 을 사용했다.

내가 작성한 코드에서는 이중 for문에서 가장 시간이 많이 소요된다. 행렬의 크기를 rowLen, colLen이라고 하면 시간복잡도는 O(rowLen * colLen)이다.

입력 행렬의 열과 행을 모두 순회하면서 덧셈 연산을 수행하므로 전체 연산 횟수는 행렬의 열 수와 행 수를 곱한 값과 같다.

제한조건에 따라 행렬의 최대 크기가 500 x 500 이하이므로,
최대 연산 횟수는 500 x 500 = 250,000번이다.

따라서 시간 복잡도는 O(N^2)을 효율적으로 사용했다.

전체 테스트를할때도 통과를 했다.

마무리

오늘 문제는 설명 제한조건 입출력 예제가 조금 적어서 조금편안하게 문제에 접근해서 풀수있었다.

profile
Junior backend developer

0개의 댓글