본문 바로가기
알고리즘 공부/JAVA - 프로그래머스

[프로그래머스][JAVA][W12-#4] 행렬의 곱셈

by hyoju1998 2021. 12. 5.

https://programmers.co.kr/learn/courses/30/lessons/12949

 

코딩테스트 연습 - 행렬의 곱셈

[[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]]

programmers.co.kr

<Level2 - 연습문제>

 

Q.

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]

 

A.

행렬의 곱셉이라서 종나 쉬운줄알았는데 왜 막상 코드로 구현하려니까 꼬여버렸다... 완전히... 살려주세요,,,

덕분에 오랜만에 행렬 공부를 새로 다시했다...

글고 나는 진짜 3중 for문 쓰면 효율성이랑 속도에서 걸릴까봐 안쓰려고 애썼는데 써야되는거였다...!
후 눈물이 앞을 가린다.
걍 행렬 곱셈 코드 공식을 외우는 게 미래에도, 정신건강에도 좋을 것 같다.
=>> ans[i][j] += a1[i][k]*a2[k][j];     //for문 알파벳 순서는 일반화된 순서 그거 그대로! 


그리고 정답배열 크기 선언할때 난 arr1과 arr2둘 중 어떤 것이 더 큰 배열인지 모르니까 두 배열의 크기를 비교해서
각각 크기를 선언했는데 그러면 안되나보당ㅎ 사실 그렇게 햇더니 제출 후 채점에서 런타임 에러가 떴당ㅎ 

밑에가 그 코드임 뗴잉 쩝;
    int leng1=0;    //행길이
    int leng2=0;    //열길이
        
    if(arr1.length>arr2.length) leng1=arr1.length;
    else    leng1=arr2.length;
        
    if(arr1[0].length>arr2[0].length)   leng2=arr1[0].length;
    else    leng2=arr2[0].length;
        
    int[][] answer = new int[leng1][leng2];          //return배열 길이 선언

*뜬금없이 헷갈리는 이차원 배열 크기 출력*

a1배열이 {[1,1],[2,2],[3,3]}이면 크기는 a1[3][2]임 => 큰 묶음 먼저 세고 작은 묶음 세기
al[3][2]일때 이차원 배열 크기 출력 : a1.length=3 && a1[0].length=2 임! 헷갈 노...!