[프로그래머스] 행렬의 덧셈 (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];
이렇게 간단하게 줄일 수 있다는 것도 잘 숙지하고 있어야겠다.