링크: https://school.programmers.co.kr/learn/courses/30/lessons/12950/?language=cpp

 

프로그래머스

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

programmers.co.kr

1. 문제 접근

이 문제는 두 개의 행렬을 더하는 문제다. 행렬의 덧셈은 같은 위치에 있는 원소끼리 더하면 된다.
예를 들어 arr1[0][0]과 arr2[0][0]을 더한 값이 결과 배열의 [0][0] 위치에 들어간다.
따라서 전체 행과 열을 순회하면서 같은 위치의 값을 더해주면 된다.


이 문제에서 중요한 부분은 두 가지다.

  1. vector<vector<int>> 형태의 이중 벡터를 이해하기
  2. 결과를 저장할 answer 벡터를 어떻게 초기화할 것인지.

 

2. 풀이

#include <string>
#include <vector>

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    vector<vector<int>> answer = arr1; // answer에 arr1 복사하기

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

    return answer;
}

위 코드에서는 먼저 answer에 arr1을 복사한다.

 

vector<vector<int>> answer = arr1;

- 이렇게 하면 answer는 arr1과 같은 크기와 값을 가진다. 이후 반복문을 돌면서 arr2의 값을 같은 위치에 더해준다.

 

answer[i][j] += arr2[i][j];

- 위 코드는 아래 코드와 같은 의미다.

 

answer[i][j] = answer[i][j] + arr2[i][j];

- 그런데 answer는 처음에 arr1을 복사한 상태이므로 결과적으로는 아래와 같다.

 

answer[i][j] = arr1[i][j] + arr2[i][j];

 

그러나 vector<vector<int>> answer = arr1; 없이 바로 위와 같이 사용하면 안 된다. 이유는 아래 문법쪽에서 더 자세하게 설명하겠다.

 

3. 문법

3-1. 이중 벡터란?

vector<vector<int>>는 벡터 안에 벡터가 들어있는 구조다. 쉽게 말하면 2차원 배열처럼 사용할 수 있다.

vector<vector<int>> arr = {
    {1, 2, 3},
    {4, 5, 6}
};

- 위 코드에서 arr은 아래와 같이 두 개의 행을 가진다.

 

arr[0] // {1, 2, 3}
arr[1] // {4, 5, 6}

 

 

- 각 원소에는 다음처럼 접근할 수 있다.

arr[0][0] // 1
arr[0][1] // 2
arr[1][2] // 6

- 즉, arr[i][j]에서 i는 행의 위치, j는 열의 위치를 의미한다.

 

3-2. arr1.size() 와 arr1[i].size()

for(int i = 0; i < arr1.size(); i++)

- arr1.size()는 행의 개수를 의미한다.

 

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

- arr1[i].size()는 i번째 행에 들어있는 원소의 개수를 의미한다.

 

 

예를 들어 아래와 같은 배열이 있다고 하자

vector<vector<int>> arr = {
    {1, 2, 3},
    {4, 5, 6}
};

- 이때 arr.size()는 2이고, arr[0].size()는 3이다.

 

3-3. 빈 벡터에서 answer[i][j] 접근이 불가능한 이유

이 문제에서 가장 주의해야 할 부분이다.

아래처럼 answer를 빈 벡터로 선언후 바로 사용하면 문제가 생긴다.

vector<vector<int>> answer;

answer[i][j] = arr1[i][j] + arr2[i][j];

- vector<vector<int>> answer;는 아직 아무 공간도 만들어지지 않은 상태다. 즉, answer[0]도 없고 answer[0][0]도 없다.

 

따라서 빈 상태에서 answer[i][j]로 접근하면 존재하지 않는 위치에 접근하는 것이 된다. 이 문제를 해결하려면 두 가지 방법이 있다.

 

1. 첫 번째 방법은 arr1을 그대로 복사하는 것이다. => 자동으로 크기 arr1과 동일하게 지정 됨

vector<vector<int>> answer = arr1;
 


2. 두 번째 방법은 크기를 미리 지정하는 것이다.

vector<vector<자료형>> 변수명(행의개수, vector<자료형>(열의개수));
vector<vector<int>> answer(arr1.size(), vector<int>(arr1[0].size()));

 

 

=> 이렇게 하면(1번 or 2번) answer에 필요한 행과 열이 미리 만들어지기 때문에 answer[i][j]로 접근할 수 있다.

 

4. 최종요약

이 문제의 핵심은 이중 벡터 구조와 초기화다.
vector<vector<int>>는 2차원 배열처럼 사용할 수 있고, arr[i][j] 형태로 원소에 접근한다.


단, 빈 벡터는 answer[i][j]처럼 바로 접근할 수 없다.
따라서 answer = arr1처럼 미리 크기를 만들어둔 뒤 값을 더해야 한다.

+ Recent posts