문제
https://school.programmers.co.kr/learn/courses/30/lessons/12949
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한사항
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
입출력 예
나의 풀이1 (실패)
def solution(arr1, arr2):
arr = [[0] * len(arr1[0]) for _ in range(len(arr1))]
for i in range(len(arr1)):
for j in range(len(arr1[0])):
for k in range(len(arr2)):
arr[i][j] += arr1[i][k] * arr2[k][j]
return arr
- 예제는 통과했는데 제출하니까 전부 런타임 에러가 발생한다.
나의 풀이2 (성공)
def solution(arr1, arr2):
arr = [[0] * len(arr2[0]) for _ in range(len(arr1))]
for i in range(len(arr1)):
for j in range(len(arr2[0])):
for k in range(len(arr1[0])):
arr[i][j] += arr1[i][k] * arr2[k][j]
return arr
행렬의 곱셈은 쉽게 설명하자면 arr1의 행과 arr2의 열을 곱하는 것이다.
for i in range(len(arr1)):
for j in range(len(arr1[0])):
for k in range(len(arr2)):
arr[i][j] += arr1[i][k] * arr2[k][j]
나는 미리 결과 행렬을 만들고, 3중 for문을 실행해서 원소를 수정하는 방식으로 풀었다.
`arr1[i]`의 각 원소와 `arr2[k]`의 각 원소를 곱해서 그 값을 `arr[i][j]`에 누적한다.
다른 사람의 풀이
def solution(arr1, arr2):
answer = []
for i in range(len(arr1)):
arr = arr1[i]
res = []
for j in range(len(arr2[0])):
temp = 0
for k in range(len(arr1[0])):
temp += arr[k] * arr2[k][j]
res.append(temp)
answer.append(res)
return answer
- 결과 행렬을 빈 배열로 초기화해서 하나의 행을 만들 때마다 `append()`한다.
- arr1의 행마다 복사본을 만든 후에 하나씩 값을 누적해서 구한다. 인덱스를 자리에 맞게 찾아나가는 과정은 이 풀이가 더 간단했던 거 같다.
회고
- 간단해 보이는 문제인데 for문을 3중으로 실행하느라 각 인덱스의 올바른 위치를 찾는데 꽤나 고생했던 문제...