Binary Journey

[코딩테스트합격자되기-자바편] 문제05. 행렬의 곱셈 본문

Algorithm/코딩테스트합격자되기-자바편

[코딩테스트합격자되기-자바편] 문제05. 행렬의 곱셈

binaryJournalist 2024. 12. 26. 21:18
반응형
💡 해당 풀이는 코딩 테스트 합격자되기 - 자바편 에서 발췌된 내용을 바탕으로 작성되었습니다.

 

문제

출처: 프로그래머스 - 행렬의 곱셈

 

내용

 

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution()을 완성해주세요.

 

제약 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

 

입출력의 예

arr1 arr2 return
[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

 

기록하기

💡 어디까지 생각해봤는지 단계적으로 기록해봅니다.

 

  • 행렬의 곱셈을 구현하자

 

 

풀이

 

풀이 시간

시작 시각 종료 시각 총 소요 시간
20:52 21:10 22분

 

문제 분석

 

제약 사항 파악 & 테스트 케이스 작성

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수
  • 곱할 수 있는 배열만 주어집니다.

 

입력값 분석

💡 입력값을 분석하면 문제에서 요구하는 알고리즘의 시간 복잡도를 간접적으로 파악할 수 있습니다.

arr1 arr2 return
[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

 

의사 코드 작성

💡 의사 코드는 동작 중심으로 작성하는 것이 중요합니다.

💡 의사 코드는 문제 해결 순서로 작성합니다.

💡 의사 코드를 충분히 테스트해봅니다.

int[][] solution(int[][] 행렬1, int[][] 행렬2) {
    for (행렬1) {
        // 행렬1의 n번째 행
        for (행렬2) {
            // 행렬1의 n번째 행의 열과 행렬2의 m번째 행의 열을 곱한다.
        }
    }
}

 

 

구현

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

 

 

복기하기

답안과 나의 풀이를 비교해보세요

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        // 1. 행렬 arr1과 arr2의 행과 ㅕㄹ의 수
        int r1 = arr1.length;
        int c1 = arr1[0].length;
        int r2 = arr2.length;
        int c2 = arr2[0].length;

        // 결과를 저장할 2차원 배열 초기화
        int[][] answer = new int[r1][c2];
        for (int i = 0; i < r1; i++) {
            for (int j = 0; j < c2; j++) {
                // 두 행렬의ㅣ 데이터를 곱해 결과 리스트에 더함
                for (int k = 0; k < c1; k++) {
                    answer[i][j] += arr1[i][k] * arr2[k][j];
                }
            }
        }
        return answer;
    }
}

 

 

요약하기

  • 최종 시간 복잡도는 O(N^3)
반응형