문제링크
문제
N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.
입력
첫째 줄에 행렬의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다. N과 M은 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.
출력
첫째 줄부터 N개의 줄에 행렬 A와 B를 더한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.
예제입력
3 3
1 1 1
2 2 2
0 1 0
3 3 3
4 4 4
5 5 100
예제출력
4 4 4
6 6 6
5 6 100
풀이
문제이해
주어진 입력 예시를 보면, 첫 번째 입력값이 '3 3'으로 주어졌습니다. 이 값은 행렬 A와 행렬 B의 크기를 나타내는 값입니다.
즉, N(행)과 M(열)의 크기가 3행 3열인 A행렬과 B행렬을 입력받아야 합니다. 입력받은 두 행렬의 같은 위치의 값을 더해 새로운 행렬을 만들고 출력해주면 됩니다. 참고로, 입력받은 N과 M의 값에 따라 다른 크기의 행렬 덧셈도 가능합니다
첫번째 풀이
우선 N(행)과 M(열)을 입력받아줍니다. 예제에서는 N=3, M=3으로 입력되었다고 가정합니다.
앞서 A와 B행렬 두개를 입력받아야한다고 했는데, 먼저 A행렬을 입력받아보겠습니다.
빈 리스트인 a를 생성한 뒤, for문으로 N번 반복하여 행렬의 각 행을 입력받습니다.
row변수에 list형태로 배열의 값을 저장해줍니다.
처음에 입력받는 값은 1 1 1값을 입력받은뒤 row에 저장되어 row에 저장된값을 a리스트에 추가해줍니다.
a = [1,1,1]
다시한번 반복문을 돌면서 2 2 2의 값을 입력받은뒤 row변수에 저장되어 이값을 a 리스트에 추가됩니다.
a = [1,1,1],[2,2,2]
이런식으로 3행 3열의 반복문을 돌리고나면 a = [[1,1,1],[2,2,2],[0,1,0]] 값이 저장됩니다.
이번에는 b 행렬을 입력받습니다. a 행렬 입력과 동일한 방식으로 빈 리스트 b를 생성하고 N번 반복문을 돌며 각 행에 대한 값을 입력받아서 리스트에 추가해줍니다. b 리스트에는 b = [[3,3,3],[4,4,4],[5,6,100]] 값이 저장됩니다.
A행렬과 B행렬을 더하려고할경우에는 A행렬뒤에 B행렬값이 추가될뿐 리스트끼리의 덧셉이 되지 않습니다. 그래서 일단 2차원배열을 선언해주는데 안쪽에있는 range(M) for문을 보면 총3번 반복하면서 a배열의 첫번째 행 i와 첫번째열 j와 b배열의 i,j 값을 더한뒤 더한값을 row 리스트에 넣어줍니다
이 과정에서 첫번째 j in range(M)배열을 돌면 4 4 4 값이 row리스트에 저장됩니다.
c = [4,4,4]
이후에 i in range(N)에서 N의 값이 0에서 1로 바뀌고 a와 b 행렬의 두번째 행 값을 서로 더해줍니다.
즉 c에는 [4,4,4],[6,6,6] 두개의 값이 담기게됩니다.
이과정을 모두 반복해주면 c = [[4,4,4],[6,6,6],[5,6,100]] 이렇게 저장이 됩니다.
예제의 출력을 보면 이 값들이 3 행으로 표시가 되어야하는데 지금은 한줄로만 표시되고 있습니다.
c값에 담긴 리스트들을 str형식으로 출력해줍니다. join함수를 사용하여 리스트안에 있는 [4,4,4]값을 문자열 444로 변경하고, 예시에 출력된것처럼 ' '을 입력하여 각 숫자사이에 공백을 넣습니다.
for문을 반복하여 출력된 결과를 확인해보면 예제 출력에서 요구된 형태로 아래처럼 출력됩니다.
4 4 4
6 6 6
5 6 100
전체 코드
N, M = map(int, input().split())
# 행렬 a 입력받기
a = []
for i in range(N):
row = list(map(int, input().split()))
a.append(row)
# 행렬 b 입력받기
b = []
for i in range(N):
row = list(map(int, input().split()))
b.append(row)
# 행렬 덧셈 수행
c = []
for i in range(N):
row = []
for j in range(M):
row.append(a[i][j] + b[i][j])
c.append(row)
# 결과 출력
for i in c:
print(' '.join(map(str, i)))
두번째 풀이
두번째 코드는 기존 첫번째 풀이의 c함수를 제외하고 a,b 변수만 사용하여 더 짧은 코드로 풀수 있는 방벙입니다.
일단 행렬을 입력받고 배열a와 배열b에 행열을 입력받는건 똑같습니다.
이전에는 행렬 덧셈을 수행하는 반복문과 결과를 출력하는 반복문 총 2개의 반복문을 더 사용하였지만 출력과 동시에 각 행렬을 더할수 있습니다.
코드를 살펴보면 2중 반복문을 사용하여 모든 배열을 순회하며 각 리스트의 값을 서로 더해줍니다.
a[0][0] 첫번째 행과 열의 값과 b[0][0] 첫번째 행과 열의 값을 서로 더해서 출력해줍니다.
이때 각 숫자 사이에 공백을 넣어주기위해 end= " "를 사용하였습니다.
for j in range(M) 코드가 3번 반복된이후에는 for j문 밖에있는 print()를 통해 줄바꿈이 된후에
다음 행의 덧셈 결과가 출력됩니다.
최종적으로는 이런 형태로 출력됩니다.
4 4 4
6 6 6
5 6 100
세번째 풀이 - 짧고 간단한 코드
우선 행렬의 크기 N,M을 입력받는 부분은 똑같습니다.
그리고 이전에는 행렬 a와 행렬b를 두번의 for문을 거쳐서 입력받았는데 이중 반복문을 사용하여 한번에 입력받습니다.
for j in range(N) 반복문에서 입력값 N의 갯수만큼(행의 갯수) 하나의 행렬을 차례대로 입력받은후,
for i in [a,b]에서 b의 행렬까지 입력받게되면 반복문을 빠져나오게 됩니다.
출력은 두번째 봤던 코드와 동일합니다 이중반복문을 통해 출력과동시에 두 배열을 더한값을 출력해줍니다.
전체코드
N,M = map(int,input().split())
a, b = [], []
for i in [a,b]:
for j in range(N):
i.append(map(int,input().split()))
for i in range(N):
for j in range(M):
print(a[i][j]+b[i][j], end=" ")
print()