Algorithm/Java

프로그래머스 - 행렬의 곱셈 java

고고마코드 2022. 7. 15. 16:03
반응형

코딩테스트 연습 - 행렬의 곱셈 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr


풀이

핵심은 2개입니다.

📌새로 만들 배열의 크기를 정한다.

📌새로 만들 배열에 기존 배열(arr1, arr2)을 계산하여 삽입한다.

문제를 잘 보면 arr1에 arr2를 곱한 결과를 반환하는 것입니다.

우선 이차원 배열 곱하는 방법을 알아보면

arr1의 첫행 첫열의 값만 계산해 볼게요.

🔨[0] = \( [ (2*5)+(3*2)+(3*2), (2*4)+(3*4)+(2*1), (2*3)+(3*1)+(2*1) ] \) 입니다.

= \( [22, 22, 11] \)

 

이렇게 arr1의 각 행과 arr2의 각 열을 순회하면서 연산을 합니다.

즉, 새로운 배열의 크기는 행은 arr1의 행의 크기, 열은 arr2의 열의 크기입니다.

 

💣만약 테스트 풀이는 통과했는데, 채점 시 런타임 에러 및 실패가 나온다면 배열의 크기를 잘못 줘서 발생한 오류일 가능성이 높아요! 

예시에는 arr1/arr2 모두 열의 수가 같은데, 열의 수를 다르게 해서 테스트 해 보면 원인을 찾을 수 있어요.

 

🎈테스트 케이스 추가

arr1 = [[2, 3, 2], [4, 2, 4], [3, 1, 4]]

arr2 = [[1, 2], [3, 4], [5, 6]]

Return = [[21, 28], [30, 40], [26, 34]]

 

테스트 케이스 추가 후에 다시 시도해 보세요. 만약 이 케이스도 통과한다면 배열의 크기를 잘못 주어서 발생한 오류는 아니고, 반복문 내에서 발생한 오류일 거예요. 그럼 연산 순서를 잘 보고 다시 풀어봐야죠...ㅎㅎ

 

 

📝풀이1

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

 

 

 

 

 

 

 

 

 

반응형