programmers.co.kr/learn/courses/30/lessons/12950
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 한다.
진짜로 진심 공간감각이 없나 봐...
'Algorithm' 카테고리의 다른 글
[C++] 프로그래머스 직사각형 별찍기 (0) | 2020.12.14 |
---|---|
[C++] 프로그래머스 x만큼 간격이 있는 n개의 숫자 (0) | 2020.12.14 |
[C++] 프로그래머스 핸드폰 번호 가리기 (0) | 2020.12.10 |
[C++] 프로그래머스 하샤드 수 (0) | 2020.12.10 |
[C++] 프로그래머스 평균 구하기 (0) | 2020.12.10 |