PS/Programmers

[level1, array] 행렬의 덧셈

git-sun 2023. 3. 19. 14:43

1. 문제

 

 

 

 

 

 

 

2. 문제 해결 논리

  1. 문제 이해
    • 주어진 것
      • arr1, arr2    //행과 열의 크기가 같은 임의의 배열
    • 요구되는 것
      • answer    //arr1과 arr2의 각 원소를 더한 배열
  2. 데이터 구조 결정
    • 방법 1. 이중 for문 사용
      • for문을 사용하기 적합한 상황
        • 인덱스에 접근할 필요가 있을 때
        • (== 순서에 의존하는 작업을 할 때)
        • 요소를 수정하거나 제어해야할 때
      • 코드가 길어지면 가독성이 떨어질 수 있음
      • 요소를 순회하고 값을 읽는 작업,  특정 순서를 따르는 작업에 좋음
    • 방법 2. for - each문 사용
      • for - each문을 사용하기 적합한 상황
        • 인덱스에 접근할 필요가 없을 때
        • (== 순서에 의존하지 않는 작업을 할 때)
        • 순회 작업이 간단할 때
      • 간결하고 가독성이 좋음
      • 요소를 순회하고 값을 읽는 작업에 좋음
    • 방법 3. Stream API 사용
      • 람다식을 사용하여 매우 간결하나, 가독성과 성능이 떨어질 수 있음
  3. 알고리즘 설계

       3-1. 이중 for문 사용

       3-2. for - each문 사용

       3-3. Stream API 사용

 

 

 

 

 

 

 

 

3. 코드 구현

 

    3-1. 이중 for문 사용

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        //arr1의 요소의 개수 == 행의 수
        int rows = arr1.length;
        //arr1의 요소(배열)의 요소 개수 == 열의 수
        int cols = arr1[0].length;


        int[][] answer = new int[rows][cols];

        //행 조작을 위한 반복문 1
        for (int i = 0; i < rows; i++) {
            //열 조작을 위한 반복문 2
            for (int j = 0; j < cols; j++) {
                //배열 arr1, arr2의 각 행과 열에 대한 덧셈
                answer[i][j] = arr1[i][j] + arr2[i][j];
            }
        }


        return answer;
    }
}

 

 

 

 

 

    3-2. for - each문 사용

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        //arr1의 요소의 개수 == 행의 수
        int rows = arr1.length;
        //arr1의 요소(배열)의 요소 개수 == 열의 수
        int cols = arr1[0].length;

        int[][] answer = new int[rows][cols];

        //arr2 배열의 각 행을 접근하기 위한 행 인덱스 생성
        int rowIndex = 0;

        //arr1 배열의 각 요소(행)에 접근하는 반복문
        for (int[] row1 : arr1) {
            //arr2 배열의 각 요소(행) 호출
            int[] row2 = arr2[rowIndex];

            //새로운 행(배열)을 arr1, arr2의 열의 수만큼 생성
            int[] newRow = new int[cols];

            //row1과 row2의 각 요소(열)에 접근하는 반복문
            for (int i = 0; i < cols; i++) {
                //row1과 row2의 각 요소(열)의 덧셈
                newRow[i] = row1[i] + row2[i];
            }
            //반환할 배열에 행 입력
            answer[rowIndex] = newRow;
            //덧셈이 끝난 후 행 인덱스 증가
            rowIndex++;
        }


        return answer;
    }
}

 

 

 

 

 

 

    3-3. Stream API 사용

import java.util.stream.*;
class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
       	//0부터 arr1.length-1까지 행의 인덱스를 생성하는 IntStream 생성
        //(이 Stream은 각 행에 대한 연산을 수행하기 위함)
        return IntStream.range(0, arr1.length)

                //각 행의 인덱스 i에 대해서
                //다시 0부터 arr1[i].length-1까지 열의 인덱스를 생성하는 IntStream 생성
                //(이 Stream은 각 열에 대한 연산을 수행하기 위함)
                .mapToObj(i -> IntStream.range(0, arr1[i].length)
                
                        //각 열의 인덱스 j에 대해서 arr1과 arr2의 덧셈 연산 수행
                        .map(j -> arr1[i][j] + arr2[i][j])
                        //각 행에 대한 덧셈 결과를 int[] 배열로 반환
                        .toArray())
                        
                //최종 결과를 int[][] 배열로 반환
                .toArray(int[][]::new);
    }
}

 

 

 

 

 

 

 

 

* Reference

https://school.programmers.co.kr/learn/courses/30/lessons/12950

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형