[프로그래머스] 행렬의 곱셈

재오·2023년 6월 8일
2

코딩테스트

목록 보기
36/46
post-thumbnail

🗒️ 문제

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

⚠ 제한사항

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

📝 문제 해설

행렬의 곱셈 문제이다. 펜으로 문제를 푸는 것은 금방 걸리지만 막상 이것을 코드로 구현하고자 하니 할 일이 태산이었다. 감조차 잡히지 않았다. 우선 for문을 사용하는 것은 알았지만 어떻게 변수를 잡아야할 지 모르겠었다.

이런 문제를 풀 때에는 주어진 테스트 케이스를 실제로 손으로 하나씩 해결해나가며 변수를 무엇으로 설정할 지 계산하는 것이 중요하다. for문을 3번 적용하여 우선 arr1의 열을 순차적으로 계산하고, arr1의 행만큼 또 순차적으로 계산하고, 마지막으로 arr2의 열만큼 계산하면 어느정도 해결이 될 것 같았다. 또한 삼중 배열 내에서 구한 값을 하나의 j문에서 더해서 배열에 추가하고 또 그 배열을 최종 배열에 추가해줘야 문제가 해결되었다.


테스트 케이스는 해결이 되어서 아무 문제없이 제출했는데 정답률 0%가 나와버렸다. 무엇이 문제인지 모르겠어서 다시한번 테스트 케이스를 풀어봤는데 감이 안잡혔다. 질문하기에서 예시로 테스트 케이스 하나를 주셔서 넣어봤는데 배열 끝자리에 NULL이 떴다. 생각해보니 j문에서 arr1[0].length만큼 계산했는데 그 개수가 arr1의 행이 아닌 arr2의 행만큼 해야 필요한 연산만 할 수 있었다.

💡 필요 문법

💻 코드

function solution(arr1, arr2) {
    let result = []; // 최종 제출 배열
    let arr = []; // 행렬 한 행을 담는 배열
    let sum = 0; // 행X열 값을 더해서 배열에 추가
    
  	// i는 arr1의 열 개수만큼 
    for(let i=0; i<arr1.length; i++){
      	// j는 arr1의 행과 arr2의 열 개수만큼
        for(let j=0; j<arr2[0].length; j++){
            sum = 0;
          	// k는 arr2의 열 개수만큼
            for(let k=0; k<arr2.length; k++){
                sum += arr1[i][k] * arr2[k][j];
            }
            arr.push(sum); // k에서 한번 순회할 때 값 모두 sum한 것
        }
        result.push(arr); // 최종 배열에 배열 넣기
        arr = []; // arr을 초기화해서 새로운 더한 값 집어 넣기
    }
    return result;
}
profile
블로그 이전했습니다

0개의 댓글