링크: 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] 위치에 들어간다.
따라서 전체 행과 열을 순회하면서 같은 위치의 값을 더해주면 된다.
이 문제에서 중요한 부분은 두 가지다.
- vector<vector<int>> 형태의 이중 벡터를 이해하기
- 결과를 저장할 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처럼 미리 크기를 만들어둔 뒤 값을 더해야 한다.
'코테 정리 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스/C++] 시저 암호 (Lv.1) (0) | 2026.05.18 |
|---|---|
| [프로그래머스/C++] 가장 가까운 같은 글자 (Lv.1) (0) | 2026.05.14 |
| [프로그래머스/C++] 최소직사각형 (Lv.1) (0) | 2026.05.13 |
| [프로그래머스/C++] 삼진법 뒤집기 (Lv.1) (0) | 2026.05.12 |
| [프로그래머스/C++] 문자열 다루기 기본 (Lv.1) (0) | 2026.05.05 |
