코테 탈출일지

[백준] 2740번: 행렬 곱셈 - 파이썬/python 본문

구현

[백준] 2740번: 행렬 곱셈 - 파이썬/python

히려이 2023. 7. 16. 01:44

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

 

2740번: 행렬 곱셈

첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개

www.acmicpc.net

접근 방식

- 행렬곱 연산의 규칙 구현

 

코드 풀이

n, m = map(int, input().split())
a = []
for _ in range(n):
    tmp = list(map(int, input().split()))
    a.append(tmp)

m, k = map(int, input().split())
b = []
for _ in range(m):
    tmp = list(map(int, input().split()))
    b.append(tmp)

answer = [[0]*k for _ in range(n)] # n*k 형태의 정답 영행렬 생성

for i in range(n):
    for j in range(m):
        for h in range(k):
            answer[i][h] += a[i][j]*b[j][h]
            
for x in range(n):
    for y in range(k):
        print(answer[x][y], end = ' ') # end = ' '로 이어 출력
    print() # 줄바꿈

이 문제의 핵심은 행렬 계산을 삼중 for 루프로 구현하는 것입니다. 곱해지는 순서에서 각각의 지정해야 하는 변수인 n, m, k이 a, b 행렬에 어떤 순서대로 인덱싱되어야 하는지 헷갈릴 수 있지만, 다시 생각해보면 a 행렬은 a[0][0]부터 각각 a[n-1][m-1], b 행렬은 b[0][0]부터 각각 b[m-1][k-1], answer 행렬은 answer[0][0]부터 answer[n-1][k-1]까지의 범위를 가지기 때문에 코드상의 i, j, h를 적절한 위치에 삽입해주면 쉽게 풀 수 있습니다.

 

메모

print(content, end = ' ')를 사용하면 내용을 한 줄에 출력할 수 있습니다. 이때 각각의 내용 뒤에는 end에서 지정한 값이 들어가게 됩니다. (이 경우에는 빈칸)