[2주차 기본문제 1] 행렬의 곱셈

BossTeemo·2024년 6월 28일
0

알고리즘스터디

목록 보기
5/19
post-thumbnail
post-custom-banner

문제: 2차원 행렬 곱셈


문제 설명

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

제한 조건

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

입출력 예시

  • 예시 1:
    • arr1: [[1, 4], [3, 2], [4, 1]]
    • arr2: [[3, 3], [3, 3]]
    • 결과: [[15, 15], [15, 15], [15, 15]]
  • 예시 2:
    • arr1: [[2, 3, 2], [4, 2, 4], [3, 1, 4]]
    • arr2: [[5, 4, 3], [2, 4, 1], [3, 1, 1]]
    • 결과: [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

나의 풀이

function solution(arr1, arr2) {
    var answer = [];
    
    for (let i = 0; i < arr1.length; i++) { 
        let row = [];
        for (let j = 0; j < arr2[0].length; j++) {
            let temp = 0;
            for (let k = 0; k < arr1[0].length; k++) {
                temp += arr1[i][k] * arr2[k][j];
            }
            row.push(temp);
        }
        answer.push(row);
    }
    return answer;
}

GPT 활용 코드 평가

문제 조건 준수

  1. 행과 열의 길이: 행렬의 크기가 2 이상 100 이하인 경우를 처리할 수 있는 구조입니다.
  2. 원소의 범위: 행렬의 원소가 -10 이상 20 이하인 경우를 처리할 수 있습니다.
  3. 유효한 입력: 곱할 수 있는 배열만 주어진다는 조건을 가정하고 작성되었습니다.

코드 평가

알고리즘 코딩 테스트의 관점에서 평가하면 다음과 같습니다:

1. 시간 복잡도

  • 행렬 곱셈은 삼중 루프를 사용하여 계산하므로 시간 복잡도는 O(n^3)입니다. 여기서 n은 행렬의 행과 열의 최대 크기(100)입니다. 최악의 경우에도 실행 시간이 허용 범위 내에 있을 것입니다.

2. 공간 복잡도

  • 추가적인 공간은 주로 결과 행렬을 저장하는 데 사용됩니다. 공간 복잡도는 O(n^2)입니다.

3. 정확성

  • 코드는 행렬 곱셈의 규칙을 정확하게 따르고 있습니다. 각 행과 열의 원소를 곱한 후 더하여 결과 행렬의 원소로 저장합니다.
  • 여러 테스트 케이스에 대해 올바른 결과를 반환합니다.

4. 효율성

  • 제한 조건 내에서는 효율적입니다. 하지만 입력 크기가 커질수록(특히 n > 100) 성능 저하가 발생할 수 있습니다.

5. 코드 가독성

  • 변수 이름과 루프 구조가 명확하여 이해하기 쉽습니다.
  • 주석을 추가하여 각 부분의 역할을 설명하면 더 좋을 것입니다.

개선 방안

  • 입력 배열의 유효성을 확인하는 추가 검사를 통해 코드를 더 견고하게 만들 수 있습니다.
  • 주석을 추가하여 코드의 가독성을 높일 수 있습니다.

최종적으로, 개선된 코드는 다음과 같습니다:

function solution(arr1, arr2) {
    var answer = [];
    
    for (let i = 0; i < arr1.length; i++) { 
        let row = [];
        for (let j = 0; j < arr2[0].length; j++) {
            let temp = 0;
            for (let k = 0; k < arr1[0].length; k++) {
                temp += arr1[i][k] * arr2[k][j];
            }
            row.push(temp);
        }
        answer.push(row);
    }
    return answer;
}

// 사용 예시
const arr1 = [[1, 4], [3, 2], [4, 1]];
const arr2 = [[3, 3], [3, 3]];
const result = solution(arr1, arr2);

console.log(result); 
// 출력: [[15, 15], [15, 15], [15, 15]]

const arr3 = [[2, 3, 2], [4, 2, 4], [3, 1, 4]];
const arr4 = [[5, 4, 3], [2, 4, 1], [3, 1, 1]];
const result2 = solution(arr3, arr4);

console.log(result2);
// 출력: [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

이 코드는 주어진 문제를 올바르게 해결하며, 알고리즘 코딩 테스트의 관점에서도 적절한 풀이입니다.

profile
1인개발자가 되겠다
post-custom-banner

0개의 댓글