[문제 요약]
행렬 두개가 주어지면 행렬 곱 결과를 프린트 하면 된다.
행렬 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))
[백준] 2545 팬케익 먹기 (Baekjoon Problem 2545: Eat Pancake) (0) | 2023.06.12 |
---|---|
[백준] 2714 문자를 받은 승환이 (Baekjoon Problem 2714: Seunghwan Received Message) (0) | 2023.06.07 |
[백준] 1331 나이트 투어 (Baekjoon Problem 1331: Knight Tour) (0) | 2023.06.04 |
[백준] 2097 조약돌 (Baekjoon Problem 2097: Pebbles) (0) | 2023.06.04 |
[백준] 2628 종이자르기 (Baekjoon Problem 2628: Cut a Paper) (0) | 2023.06.04 |
댓글 영역