티스토리 뷰
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