본문 바로가기
개발자 전향 프로젝트

프로그래머스 Level -1 코딩테스트 연습문제 [행렬의 덧셈] + 배열의 기초

by 샘오리 2022. 5. 8.

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 된다.

2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성하시오.

 

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않는다.

예시:

Array1                                           Array2                                          Result
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]

이 문제를 풀기 위해서는 기본적으로 배열이 무엇인지,

또 2차원 배열은 무엇인지 이해해야 한다.

 

먼저 배열은 영어로 Array라고 하며 줄여서 arr라고 쓴다.

배열은 기본적으로 선형 자료구조로

선형구조

  1. 동일한 타입의 연관된 데이터를 연결지어서 메모리에 저장하고 하나의 변수에 관리하며
  2. 순서는 0부터 시작한다는 특징을 가지고 있다.

예시로는

String [] weeks = {"월", "화", "수", "목", "금", "토", "일"}; 

* 요일은 모두 String(문자열) 이라는 동일한 타입을 가지고 있다.

*"월"이라는 데이터는 0번째의 인덱스(순서)를 가지고 있다.

weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";

 

그렇다면 2차원 배열은 뭐가 다른가?

엑셀 테이블을 생각하면 쉽다.

세로 열 , 가로 행

먼저 엑셀을 포함한 모든 테이블은 Row와 Column, 즉, 열과 행을 가지고 있다.

단순히 동일한 타입의 연관된 데이터를 일렬로 나란히 쓰는 것이 아니라

가로 세로가 있는 테이블처럼 저장하고 관리를 하고자 할 때 쓰는 것이 2차원 배열이다.

 

그러면 어떻게 쓰는 것인가? 간단히 말해서 배열을 나타내는 대괄호[]를 한번 더 써주면 된다.

 

그리고 첫번 째 대괄호는 총 세로 열의 길이(Row number),

두번 째 대괄호는 총 가로 행의 길이(Column number)를 나타낸다.

 

그래서 3x3 테이블을 만들고 싶으면 int[3][3] array 를 주고 값을 넣으면 된다.

1 2 3
4 5 6
7 8 9

눈치 챘을 수도 있지만 사실 1,2,3 이라는 배열 4,5,6이라는 배열, 그리고 7,8,9 라는 1차원 배열들을

테이블 형식으로 관리하기 위해 합쳐놓고 2차원 배열이라고 부르는 것이다.

 

아무튼 이렇게 되면 세로 열도 3개, 가로 행도 3개가 된다. 

 

자 이제 다시 문제로 돌아간다.

 

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 된다.

2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성하시오.

 

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않는다.

예시:

Array1                                           Array2                                          Result
[[1,2],[2,3]] [[3,4],[5,6]] [[4,6],[7,9]]

 

이 문제는 결국 두개의 배열을 더하는 것이고 각 배열마다 해당하는 인덱스의 값을 찾아내야 하는 것이다.

Array1을 테이블 형식으로 만들면

0번째 인덱스 1 2
1번째 인덱스 2 3

Array2를 테이블 형식으로 만들면

0번째 인덱스 3 4
1번째 인덱스 5 6

이 된다.

즉 Array1 배열기준으로 세로 열 0번째 이면서 가로 행 0번째인 1과

Array2 배열기준으로 세로 열 0번째 이면서 가로 행 0번째인 3을 더하고 

그 작업을 나머지에도 반복하여서

각각 더한 값을 새로운 배열에 담으라는 것이다.

고로 아래의 배열이 만들어지면 되는 것이다.

0번째 인덱스 4 6
1번째 인덱스 7 9

그럼 코드로 가보자. 

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        for(int i=0 ; i<arr1.length ; i++) {
            for(int j=0 ; j<arr1[0].length ; j++) {
                arr1[i][j] += arr2[i][j];
            }
        }
        return arr1;
    }
}

2차원 배열 arr1 과 arr2를 Parameter로 전달받는다는 가정하에 

반복문을 돌려서 각각 더하는 코드를 짠 것이다.

 

2중 for 문을 돌렸는데 그 이유는 세로열, 가로행이 있기 때문에

구구단을 만드는 것과 동일하게

세로열은 가로행이 다 끝나야지만 넘어가는 로직을 만든 것이다.

 

아까도 말했듯 첫번 째 대괄호는 세로 열의 길이를 나타내는 것이기 때문에

 

세로 열의 길이 만큼 반복되는 for 문은Outer for 문으로 시작해줘야 하고

가로 행의 길이 만큼 반복되는 for 문은 Inner for 문으로 시작해야 한다.

 

[[1,2],[2,3]]

위와 같이 주어진다면 배열의 총 길이는 2개이다.

[1,2] 를 0번 째 인덱스이자 하나의 배열로 [2,3] 또한 1번 째 인덱스이자 하나의 배열로 치기 때문이다.

배열안에 배열이 들어있고 그 배열이 2개가 있으니 바깥 배열의 총 길이는 2개가 되는 것이다.

 

그렇다면 배열의 총 길이는 세로 열로 생각할 수 있을 것이고

가로 행의 길이는 각 배열에 몇개의 데이터 있는지 보면 알 수 있을 것이다.

 

0번째 인덱스를 배열이라고 생각하면 1,2 라는 두개의 데이터가 있고

1번째 인덱스를 배열이라고 생각하면 2,3 이라는 두개의 데이터가 있다.

0번째 인덱스 1 2
1번째 인덱스 2 3

자 그러면 세로열의 길이이자 바깥 배열의 총 길이인 arr1.length는 2가 되고

0부터 시작하여 2에 도달하기 전인 1까지 즉, 두번 아래의 Inner for 문을 반복한다는 것이다.

 

Inner for문을 살펴보면 0번째 인덱스의 길이를 나타내고 그 길이는 위에서 설명 했듯 1,2 => 2개 이기 때문에

가로 행의 길이로 2개 => 0부터 시작하여 2에 도달하기 전인 1까지, 두번 아래 명령어를 반복하는 것이다.

 

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

arr1[i][j] 에서 [i]는 세로 열의 순서(인덱스)

[j]는 가로 행의 순서(인덱스) 를 나타내고 수학에서 좌표의 개념과도 비슷하다고 할 수 있다.

 

arr1[i][j] += arr2[i][j] 에서 += 는 단축어로

a+=b 를 예로 들었을 때

a = a+b 라고 하는 것과 같고

= 연산자는 우측의 값을 좌측의 값으로 주입한다는 것이기에

결국 위 명령어는 arr1이라는 배열에 arr1[i][j] + arr2[i][j] 한 값을 주입하는 것이다.

 

최종적으로 arr1을 return 하게 되면 각각 더해진 값을 반환하게 되는 원리이다.