[프로그래머스] 행렬의 덧셈 (Lv.1)


문제 링크


프로그래머스 - 행렬의 덧셈


문제 설명


행과 열의 크기가 같은 두 행렬 arr1, arr2를 입력받아 두 행렬을 더한 결과를 반환한다.

예) [[1,2],[2,3]] + [[3,4],[5,6]][[4,6],[7,9]]


내 풀이


이중 for문으로 행(i)과 열(j)을 순회하면서, 각 행마다 임시 벡터 temp를 만들어 arr1[i][j] + arr2[i][j] 값을 채운 뒤 answer에 push_back했다.

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    vector<vector<int>> answer;
    
    for(int i = 0; i < arr1.size(); i++)
    {
        vector<int> temp;
        for(int j = 0; j < arr1[i].size(); j++)
        {
            temp.push_back(arr1[i][j] + arr2[i][j]);
        }
        
        answer.push_back(temp);
    }
    
    return answer;
}


시간복잡도 분석


행 수를 r, 열 수를 c라 하면 이중 for문을 전부 순회하므로 O(r × c).

문제 제한상 행과 열의 크기는 최대 500이므로 최악의 경우 O(500 × 500) = O(250,000)으로 충분히 통과 가능하다.


후기


arr1.size()와 arr1[0].size()를 가지고 answer의 크기를 미리 할당해서 재할당 비용을 제거하는 방법도 생각을 해봐야겠다. 그리고 나서

for(int i = 0; i < arr1.size(); i++)
    for(int j = 0; j < arr1[0].size(); j++)
        answer[i][j] = arr1[i][j] + arr2[i][j];

이렇게 간단하게 줄일 수 있다는 것도 잘 숙지하고 있어야겠다.