본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2740번: 행렬 곱셈 -Python

728x90

[백준알고리즘] 2740번: 행렬 곱셈 -Python

https://www.acmicpc.net/problem/2740

 

2740번: 행렬 곱셈

첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개가 차례대로 주어진다. N과 M, 그리고 K는 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

www.acmicpc.net

분할 정복까지는 아닌 것 같지만 소개에도 "행렬의 거듭제곱을 계산하기 전에 먼저 풀어야 할 문제"라고 나와있다. 행렬의 곱셈을 할 줄만 안다면 코드를 짜는 건 쉽기 때문에 코드만 올린다.

 

이 문제 역시 문제를 풀고 다른 사람들의 코드를 확인하니 정말 획기적으로 코드를 줄이신 분들이 많았다. 나는 결과 행렬을 새로 저장하고 출력하는 시간이 걸릴까 봐 바로 출력을 걸었는데도 속도가 더 느렸으니.. 대단하신 분들은 참 많다. 분발해야겠다.

 

import sys

N, M = map(int, sys.stdin.readline().split())
matrixA = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]

M, K = map(int, sys.stdin.readline().split())
matrixB = [list(map(int, sys.stdin.readline().split())) for _ in range(M)]

for n in range(N):
    for k in range(K):
        tmp = 0
        for m in range(M):
            tmp += matrixA[n][m] * matrixB[m][k]
        sys.stdout.write(str(tmp) + " ")
    sys.stdout.write("\n")

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90