문제
곱셈을 할 수 있는 두 개의 행렬이 주어질 때, 두 행렬의 곱을 출력하라.
https://programmers.co.kr/learn/courses/30/lessons/12949
입력
2차원 배열 2개
출력
두 행렬의 곱셈의 결과
알고리즘
def solution(arr1, arr2):
# 두 행렬을 파라미터로 받아서, 곱셈을 한 결과값의 형태를 가지고, 모든 값이 0인 행렬을 만든다.
answer = [len(arr2[0]) * [0] for i in range(len(arr1))]
# 정답 행렬을 2중 for문을 통해 순회하면서, 각 요소의 값을 채운다.
for i in range(len(answer)):
for j in range(len(answer[i])):
# 아래에 for문이 가장 핵심이다.
for k in range(len(arr1[i])):
answer[i][j] += arr1[i][k] * arr2[k][j]
return answer
arr1 = [[1, 4], [3, 2], [4, 1]]
arr2 = [[3, 3], [3, 3]]
print("결과: ", solution(arr1, arr2))
설명
1. 2차원 배열 answer의 shape를 정해주고, 모든 값을 0으로 초기화한다.
2. 2중 for문을 통해서 answer의 모든 요소를 순회하면서, 각 요소의 값을 채운다
3. 마지막 for문이 가장 중요하다.
- k는 0부터 len(arr1[i]), 즉 첫 번째 행렬의 열의 갯수만큼 반복한다.
- 행렬의 곱에서 한 요소의 결과값을 얻으려면, arr1의 한 행과 arr2의 한 열을 차례대로 곱하고, 그 값을 모두 더해야 한다.
- A가 m * n 행렬이라 하고, B가 a * b 행렬이라 하고, C가 그 결과로 나오는 m * b 행렬이라 하자.
- C11을 구해보자면, C11 = A11 * B11 + A 12 * B21 + .... + A1n * Ba1 이다.
- 이 과정을 i, j, k의 인덱스를 사용해서 일반화하고, 그 값을 누적시켜서 더한 것이 3번째 for문의 내용이다.
결과
원하는 값을 출력한다.
후기
프로그래밍 언어, 알고리즘, 자료구조 등의 학교 수업에서 분명히 배웠던 알고리즘이라 손풀기 정도로 생각하고 도전했는데, 그 내용이 잘 생각나지 않아서 적잖이 당황했다. 이번에 확실하게 정리를 해두고, 반복문의 활용에 대해서도 좀 더 많은 연습이 필요할 것 같다.
'공부 > 알고리즘' 카테고리의 다른 글
[SWEA]염라대왕의 이름 정렬 - Python3 (1) | 2020.01.08 |
---|---|
[프로그래머스 스택/큐]주식 가격 - Python3 (0) | 2020.01.06 |
[프로그래머스 해시]전화번호 목록 - Python3 (0) | 2020.01.06 |
[프로그래머스 해시]완주하지 못한 선수 - Python3 (6) | 2020.01.06 |
[프로그래머스 스택/큐]짝 지어 제거하기 - Python3 (2) | 2020.01.04 |