행렬의 곱셈
답:
더보기
def solution(arr1, arr2):
answer = []
n1 = len(arr1)
n2 = len(arr2[0])
for i in range(n1):
num_list = []
for k in range(n2):
number = 0
for j in range(len(arr1[0])):
number += arr1[i][j] * arr2[j][k]
num_list.append(number)
answer.append(num_list)
return answer
문제 분석 및 해석
이차원배열 arr1, arr2
arr1에 arr2를 곱한 결과를 반환하는 함수, solution 반환
>> 풀이생각
for문을 여러번 사용하여 arr1의 행과 arr2의 열을 곱하고 더하는 식을 만든다
과정1.
def solution(arr1, arr2):
"""행렬의 곱셈 : arr1의 행 * arr2의 열의 합이 해당 위치의 결과값"""
n = len(arr1)
answer = [[0]*n for _ in range(n)]
for i in range(n): # arr1의 전체 요소 길이만큼 0 1 2
for j in range(len(arr1[i])): # arr1의 요소(행 길이)
for k in range(len(arr2)): # arr2의 열 index
answer[i][j] += arr1[i][k] * arr2[k][j]
return answer
이 과정에서 answer 행렬의 크기에 오류가 생겼다.
오류 : 실행한 결괏값 [[15,15,0],[15,15,0],[15,15,0]]이 기댓값 [[15,15],[15,15],[15,15]]과 다릅니다.
answer = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 행렬 잘못만듦
과정2.
따라서 arr1[0]길이와 arr2의 길이를 사용해 answer를 만들도록 수정함
def solution(arr1, arr2):
n1 = len(arr1[0])
n2 = len(arr2)
answer = [[0]*n2 for _ in range(n1)] #arr2의 열 / arr1의 행
for i in range(len(arr1)):
for j in range(n1):
for k in range(n2):
answer[i][j] += arr1[i][k] * arr2[k][j]
return answer
0으로 이루어진 행렬은 잘 만들어졌지만 아래의 식에서 list out of range오류 발생..
고쳐서 테스트 케이스는 통과했지만 정확성 테스트 모두를 실패 / 런타임 에러…
따라서 식을 만드는 과정 자체를 array에 append 및 초기화하는 형식으로 수정하고자 했다.
과정3.
for 문을 돌면서 (행 * 열) 계산을 number에 더한다.
num_list에 계산한 number를 append, answer에 num_list를 append하고 초기화 하여 다음 행렬을 계산
def solution(arr1, arr2):
answer = []
n1 = len(arr1)
n2 = len(arr2[0])
for i in range(n1):
num_list = []
for k in range(n2):
number = 0
for j in range(len(arr1[0])):
number += arr1[i][j] * arr2[j][k]
num_list.append(number)
answer.append(num_list)
return answer
첫번째 방법. 왜 안될까?
'알고리즘 풀이' 카테고리의 다른 글
[알고리즘] 프로그래머스 | 둘만의 암호 (0) | 2023.08.18 |
---|---|
[알고리즘] 프로그래머스 | 신규 아이디 추천 (0) | 2023.08.17 |
[알고리즘] 프로그래머스 | 소수 만들기 (0) | 2023.08.15 |
[알고리즘] 프로그래머스 | 소수 찾기 Lv.1 (0) | 2023.08.12 |
[알고리즘] 프로그래머스 | 삼총사, 키패드 누르기 (0) | 2023.08.11 |