코드 그라데이션

[Lv.1] 행렬의 덧셈 본문

Java/알고리즘

[Lv.1] 행렬의 덧셈

완벽한 장면 2023. 2. 2. 17:23

2차원 배열 제대로 알기!

행렬의 덧셈

문제 설명

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

제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

입출력 예

<첫 번째 나의 접근>

- 같은 행의 값을 다 더하는 반복문을 하나 쓰고, 그 다음에 같은 열을 다 더하는 반복문을 하나 써서 그 결과를 출력해야 할 것 같다.

 

Q. 그러면 반복문이 두 개가 필요한 것인가?

A. 그렇게 생각한다.

 

Q. 그럼 첫 번째 반복문에서 모든 행을 더한다는 건, 우리가 몇 번째 원소 값 이렇게 가져올 수는 있는데, 행 자체를 통째로 더해줄 수 있는가? => 쉽지 않다.

 

어려운 이유 : 더 생경한 2차원 배열이라서 그렇다.

먼저 행을 더하는 것부터 해보자.

==> 2차원 배열이 주어졌을 때 행의 길이를 구하는 거랑 열의 길이를 구하는 것 이거는 외워야 한다.

 

2차원 배열의 행의 길이는 어떻게 구하냐, 1차원 배열과 동일하다.

1차원 배열에서 행의 길이 : 

행의 길이 = 배열의 이름.length
ex) arr.length

열의 길이

열의 길이 : 배열이름[index].length
ex) arr[0].length
"그러니까 반복문이라는 건 뭔가 특별하고 새로운 게 아니라 
어떤 코드가 진짜 그만큼 횟수만큼 반복이 된 거라고 보면 되거든요."

"그럼 반대로 반복문을 어떻게 짜야 되는지는 역으로 저희가 생각을 해서 
어떻게 반복이 되는지를 보면 코드가 좀 더 떠오르기가 쉬워요."
행렬
{{1,2}, {{3,4},
{2,3}}  {5,6}}

} 이 있다고 할 때, 이 두개를 이용해서

이것이
{{4,6}, 
{7,9}} 이게 어떻게 될까?

// 원소의 위치끼리 더한다!

// 더 쪼개보기
- 0행 0열과 0행 0열을 더한다
- 0행 1열과 0행 1열을 더한다 ....
arr1[0][0] + arr2[0][0]
arr1[0][1] + arr2[0][1] ....

얘는 위치로 그대로 간다.("0행 0열과 0행 0열을 더하면 그 결과도 새로운 배열의 0행 0열에 들어간다"

arr[0][0] = arr1[0][0] + arr2[0][0]
arr[0][1] = arr1[0][1] + arr2[0][1] 
arr[0][2] = arr1[0][2] + arr2[0][2] ...

1. 이제 반복되는 부분을 찾아볼까?
arr[][] = arr1[][] + arr2[][]
=> 요 로직 자체가 반복된다.
"숫자만 갈아끼워주면 되는 거니까"

"그럼 애를 어떤 반복문에 넣어주면 되겠구나" 생각하면 된다.
for() {
	arr[][] = arr1[][] + arr2[][] 요런 식으로...
}


2. 무엇이 변하는가?
arr[0][0] = arr1[0][0] + arr2[0][0]
arr[0][1] = arr1[0][1] + arr2[0][1] 
arr[0][2] = arr1[0][2] + arr2[0][2]
행은 그대로고, 열이 변하지.
그럼 열을 변화시키면 되겠구나. 0에서 1, 2, 3....

그러면 
for() {
	arr[][] = arr1[][] + arr2[][]; 
}
이 식에서
for(int i=0; i<arr1[0].length; i++) {
	arr[0][i] = arr1[0][i] + arr2[0][i] // 변하는 값들은 i로 채워넣어준다! 
}
==> 이렇게만 하면 첫번째 행만 계산한 것,

이제 우리는 행이 몇 번 반복되는지 세어 줘야지.
3개의 행을 더해준다고 가정하면?
for(int i=0; i<arr1[0].length; i++) {
	arr[0][i] = arr1[0][i] + arr2[0][i]; 
}
for(int i=0; i<arr1[0].length; i++) {
	arr[1][i] = arr1[1][i] + arr2[1][i] 
}
for(int i=0; i<arr1[0].length; i++) {
	arr[2][i] = arr1[2][i] + arr2[2][i] ;
}

// 생각해보자, 이 로직에서 반복되고 있는 것은?
=> 이 for문 자체가 반복되고 있지! 여기서 변하는 것은? 행의 숫자!

그럼 이 반복문 틀을 그대로 가져와서 변형을 약간만 시켜주면 된다.
행만 바꿔주자, i를 앞에서 이미 썼으니까, 이번엔 문자 j를 써보자.
for() {
	arr[0][i] = arr1[0][i] + arr2[0][i] 
}
변형
for(int j=0; j<arr1[j].length; j++) {
	arr[j][i] = arr1[j][i] + arr2[j][i];
}

이제 두 개를 합치자!
"이중 for문의 형태가 나온다!"

for(int j = 0; j < arr1.length; j++) {
	for(int i = 0; i < arr1[j].length; i++) { // 행이 바뀌어서.
    		arr[j][i] = arr1[j][i] + arr2[j][i];
    }
}

내 풀이

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

 

실행이 되지 않았다. 그래서 i와 j의 위치를 바꿔보았다. 그러니까 된다.

(시간 날 때, 설명해주신 코드 리펙터링 해서 i와 j를 바꿔서 이해해보기)

정답코드

class Solution {

    public int[][] solution(int[][] arr1, int[][] arr2) {
    
        int[][] answer = new int[arr1.length][arr1[0].length];

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

'Java > 알고리즘' 카테고리의 다른 글

[Lv.1] 문자열 내 p와 y의 개수  (1) 2023.02.03
[Lv.1] 평균 구하기  (0) 2023.02.02
[lv.0] 배열의 평균값  (0) 2023.01.25
[lv.0] 나머지 구하기  (0) 2023.01.25
[lv.0] 짝수의 합  (0) 2023.01.25
Comments