프로그래머스 : 행열의 덧셈

원녕·2024년 3월 11일
0

코드카타

목록 보기
5/5
class Scratch {
    public static void main(String[] args) {

      int[][] arr1 = {{1,2,3}
                    , {3,4,5}};
      int[][] arr2 = {{3,4,5},
                      {5,6,7}};
      int[][] result = solution(arr1, arr2);

    }
  public static int[][] solution(int[][] arr1, int[][] arr2) {
    int[][] answer;
    answer = new int[arr1.length][arr2[0].length];
    for (int i = 0; i < arr1.length; i++) { //[1],[2],[3]    행
                                            //[3],[4],[5]    원소를 담고있는 세로축 길이
                                              // 1,2 세로로 보면 2 -> 행
      for (int j = 0; j < arr2[i].length; j++) {
        System.out.print(arr1[i][j]);
        answer[i][j] = arr1[i][j] + arr2[i][j];
      }
      System.out.println();
    }

    return answer;
  }

풀이

2차원 배열을 이용해서 문제를 푸는 방법입니다.
간단히 설명하자면 i는 arr1의 length, 즉 원소가 담길 상자의 총개수를 의미합니다
그후 중첩for문을 이용하여 j가 arr2[i].length를 가지는데 이건 arr1[i]이든 뭐든 상관없습니다.
주어진 문제에 두 배열이 크기가 모두 같은 배열이라고 명시되어있었기 때문이죠
그후에 두 배열을 더한값을 answer의 행,열 에 넣어주면 끝입니다.

어려웠던 점

행열을 아예 모르는 상태에서 블로그에서 글만 보고 코드를 가져오다시피 풀어서 남는것도 없고 당연히
남에게 설명할 수 있을정도의 논리를 갖지 못했었습니다. 그래서 반성하는 마음으로 행열에대해서
이해해보고자 노력했고 그결과 아래와 같이 설명할 수 있게 되었습니다.

행은 가로축을 기준으로 하나씩 내려가면서 개수를 카운트하는데

------------1
------------2
------------3

이런식입니다. 쉽게 설명하자면 상자개수를 예로 들수잇는데 원소를 담고있는 상자들의 총개수를 행 이라고 칭합니다.

열은 세로축을 기준으로 옆으로 이동하면서 개수를 카운트합니다 마치 게가 게걸음 하듯이 말이죠
이게 처음에 정말 헷갈렸습니다. 행과 열의 순서를 뒤바꿔가면서 생각하고 그걸 설명하려니 모순이 되는점이 많았었습니다.
이것도 그림으로 보이자면 이런 느낌입니다.
|||
|||
|||
123

이 그림을 합친다면?

-----------------행
|
|
|
|
|

성능이슈 발생

테스트 1 〉 통과 (0.02ms, 75.5MB)
테스트 2 〉 통과 (0.05ms, 66.3MB)
테스트 3 〉 통과 (0.11ms, 72.2MB)
테스트 4 〉 통과 (0.08ms, 81.9MB)
테스트 5 〉 통과 (0.06ms, 72.4MB)
테스트 6 〉 통과 (0.08ms, 81.3MB)
테스트 7 〉 통과 (0.02ms, 76.7MB)
테스트 8 〉 통과 (0.04ms, 66.1MB)
테스트 9 〉 통과 (0.48ms, 82.8MB)
테스트 10 〉 통과 (0.38ms, 76.2MB)
테스트 11 〉 통과 (0.23ms, 76.6MB)
테스트 12 〉 통과 (0.30ms, 84.9MB)
테스트 13 〉 통과 (0.70ms, 84.5MB)
테스트 14 〉 통과 (0.37ms, 94.1MB)
테스트 15 〉 통과 (0.32ms, 78.8MB)
테스트 16 〉 통과 (0.32ms, 85.2MB)
테스트 17 〉 통과 (8.10ms, 111MB)

테스트 17을 보면 8ms가 걸리면서 꽤나 메모리도 많이 잡아먹고있는걸 알수있다.
그러면 이걸 개선한 코드를 한번 보도록하자

다른 코드


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

answer가 arr1의 주소를 참조하게되어 결론적으로
answer[i][j] 에는

profile
메타인지하는 개발자

0개의 댓글