상세 컨텐츠

본문 제목

[백준] 2740 행렬 곱셈 (Baekjoon Problem 2740: Matrix Multiplication)

파이썬

by Riella 2023. 6. 4. 11:23

본문

728x90

문제 출처

 

[문제 요약]

행렬 두개가 주어지면 행렬 곱 결과를 프린트 하면 된다.

행렬 A = N*M

행렬 B = M*K

참고로 행렬 곱은 아래 이미지처럼 A의 row(열), B의 column(행)에 있는 각각의 원소들을

(순서가 같은것끼리) 곱한 후 더하면 된다.

1*(-1) + 2*0= -1

1*(-2) + 2*0 = -2

1*0 + 2*3 = 6

...

5*0 + 6*3 = 18

 

따라 빨간색으로 표시 되어있는 열과 행이 사용되기 때문에 A의 행과 B의 열의 크기는 같다.

 

입력은 우선 행렬 A의 크기 (n, m)가 주어지고

이후 m개의 줄에 걸쳐 각 줄마다 n개의 원소가 띄어져 입력이 된다.

바로 이어서 행렬 B의 크기 (m, k)가 주어지고

이후 k개의 줄에 걸쳐 각 줄마다 m개의 원소가 띄어져 입력이 된다.

3 2
1 2
3 4
5 6
2 3
-1 -2 0
0 0 3

 

[풀이]

우선 두개의 matrix를 입력 받는다.

그리고 nested loop을 이용하여 곱을 계산하는데

n이 열, k가 행이기 때문에 멘 바깥쪽 룹을 n만큼, 안쪽 룹을 k만큼 돌려준다.

그 안에 m에 대하여 룹을 하나 더 만들어준다 <- 여기에서 하나의 원소값을 계산한다.


[유의할 점 #1]

행렬 값이 입력될 때 열이 통으로 입력되기 때문에 nested loop 사용할 필요가 없음


[파이썬 3 코드]

if __name__ == "__main__":
    # 행렬 A의 크기 n(height)*m(width)
    n, m = input().split()
    n = int(n)
    m = int(m)

    A = []
    # nested loop 쓰는거 아님
    for i in range(n):
        row = input().split()
        A.append(row)

    m, k = input().split()
    m = int(m)
    k = int(k)
    
    B = []
    for i in range(m):
        row = input().split()
        B.append(row)

    for i in range(n):
        row = []
        for j in range(k):
            elem = 0
            for c in range(m):
                elem += int(A[i][c]) * int(B[c][j])
            row.append(str(elem))
        print(" ".join(row))

관련글 더보기

댓글 영역