[C++] 프로그래머스 행렬의 덧셈
2020. 12. 10.
반응형

programmers.co.kr/learn/courses/30/lessons/12950

 

코딩테스트 연습 - 행렬의 덧셈

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요

programmers.co.kr

 

1. 서론

 

문제 자체는 엄청 간결한데 내가 2차원 배열이 너무 헷갈려서 코드를 짜는데 시간이 좀 걸렸다. 난 진짜 공간감각이라고 해야 할지... 그런 게 부족한 걸까!?

 

2. 문제 풀이

 

2차원 행렬 두 개가 주어진다. 그 두 행렬의 같은 행, 같은 열의 값을 더해 새로운 2차원 행렬에 계산 값을 넣어 return 하는 문제이다.

 

입출력 예시로 보자면

 

arr1 : [[1,2],[2,3]]

arr2: [[3,4],[5,6]]

answer: [[4,6],[7,9]]

 

이런 형태로 answer를 return 하면 되는 것이다. 그러나... 그냥 수학적으로는 너무 쉬운데 코드로 짜려니까 너무 헷갈리기 시작했다. 

머리로만은 도저히 안 되겠어서 종이에다가 직접 써보기도 하고 밖에서 2차원 배열에 구조에 대해 이해하려고 코드를 짜서 돌려보기도 했다.

 

결과적으로는 이렇다. 문제에서 주어진 테스트 케이스에 홀리면 안 된다. 2차원 배열인 것만 같고, 그 안의 작은 배열에는 숫자가 몇 개가 들어갈지, 그 작은 배열이 몇 개나 될지는 미지수다. 처음엔 테스트 케이스에 홀려 무조건 2개의 배열만 나오는 줄 알고 코드를 짰다가 다 털렸다. (나 같은 사람은 또 없길^^)

 

- 첫 번째 포인트: i x j

2차원 배열을 돌릴 for문의 숫자를 알기 위해서 시행착오 끝에 알게 된 것. arr1과 arr2는 어차피 계산을 해야 하기 때문에 두 배열의 i, j 값은 같다. 그러면 이 2차원 배열의 i x j 값은 어떻게 알 수 있을까? 바로 arr1의 size. arr1의 사이즈는 2, arr1[0]의 사이즈는 2 => 2 x 2의 행렬인 것이다. 솔직히 누군가에게는 당연하게 떠오르겠지만 나는 너무 오래 코딩을 안 해서인지 뚝딱거릴 수밖에 없었다. 

너무 당연하고 쉽기도 하지만 갑자기 막 좌표랑 개념이 헷갈리면서 엄청 헤맸다. 또 하필 예시가 2 x 2인지라 그렇게 깊게 생각 안 하기도 했고.

그리고 테스트 케이스에서는 2 x 2 말고 3 x 100 일 수도 있는 것이기 때문에 i x j를 똑바로 파악해야 한다.

 

- 두 번째 포인트: 벡터의 재활용 

그리고 무조건 앞이 2가 아님을 깨달은 순간부터 벡터를 그럼 무한으로 임의로 생성을 어떻게 하지? 하는 문제가 생겼는데 새로 알게 된 것이 있다. 바로 v.clear(). clear()를 쓰면 벡터를 초기화할 수 있다. 벡터를 무한으로 재활용할 수 있기 때문에 딱 하나만 생성해도 되는 것이다. 

 

3. 코드 설명

 

#include <vector>

using namespace std;

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

    return answer;
}

 

고민한 시간이 무색하게 코드는 간결하다.

i x j 사이즈의 배열을 여러 번 돌리면서 1차원 배열을 하나 만들고 answer 배열에 계속 넣고, 1차원 배열은 초기화하고 위의 계산 과정을 반복한다.

그리고 완성된 2차원 배열을 return 한다.

 

 

진짜로 진심 공간감각이 없나 봐...

 

 

 

 

반응형
myoskin