행렬의 덧셈

유동헌·2021년 9월 3일
0

1일1알고리즘

목록 보기
3/12

문제설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

부족한 개념

  1. 문제를 풀면서 그 동안 대충 써왔었던 zip에 대한 추가 공부가 필요하다는 것을 느꼈다.
  2. zip을 사용하지 않고 for loop를 돌며 행렬만 더해보려고 했는데, 그 부분은 잘 되질 않았다.

부족한 개념 공부 zip

zip의 범위

  1. 같은 자료형, 똑같은 배열의 수
arr1 = [[1,2],[2,3]]
arr2 = [[3,4],[5,6]]

for i, j in zip(arr1, arr2):
    print(zip(arr1, arr2))
    print(i)
    print(j)

# 출력
<zip object at 0x7ff95807cf80>
[1, 2]
[3, 4]
<zip object at 0x7ff958080040>
[2, 3]
[5, 6]
  • 같은 길이, 같은 자료형인 경우에 서로 짝지어 출력이 된다.
  1. 같은 경우
arr1 = [[3,4],[5,6],[7,8]]
arr2 = [[4,3],[5,4],[8,7]]

for i, j in zip(arr1, arr2):
    print(zip(arr1, arr2))
    print(i)
    print(j)

# 출력
<zip object at 0x7f88101ecfc0>
[3, 4]
[4, 3]
<zip object at 0x7f88101f1080>
[5, 6]
[5, 4]
<zip object at 0x7f88101f1080>
[7, 8]
[8, 7]
  1. 리스트 형태
arr1 = [5,4,3,6,8]
arr2 = [7,4,2,7,8]

for i, j in zip(arr1, arr2):
	print(zip(arr1, arr2)
	print(arr1)
	print(arr2)

# 출력
<zip object at 0x7f98801f0040>
5
7
<zip object at 0x7f98801f0040>
4
4
<zip object at 0x7f98801f0040>
3
2
<zip object at 0x7f98801f0040>
6
7
<zip object at 0x7f98801f0040>
8
8
  1. 다른 형태
arr1 = ['Java', 'Python', 'JavaScript']
arr2 = [14, 3, 6]

for i, j in zip(arr1, arr2):
	print(zip(arr1, arr2)
	print(arr1)
	print(arr2)

<zip object at 0x7f92201d0080>
Java
14
<zip object at 0x7f92201d0080>
Python
3
<zip object at 0x7f92201d0080>
JavaScript
6

문제 풀이

  1. 처음 풀이
def solution(arr1, arr2):
    
    result = []
    
    middle = []
    
    for mid_arr1, mid_arr2 in zip(arr1, arr2):
        for i, j in zip(mid_arr1, mid_arr2):
            middle.append(i+j) # [4], [4,6] .. 등의 결과를 받고,
    result.append(middle) # 이 부분에서 리스트가 하나 더 추가되어 아래와 같은 결과값을 반환
        
    return result

# 결과
테스트 1
입력값 〉	[[1, 2], [2, 3]], [[3, 4], [5, 6]]
기댓값 〉	[[4, 6], [7, 9]]
실행 결과 〉	실행한 결괏값 [[4,6,7,9]]() 기댓값 [[4,6],[7,9]]() 다릅니다.
테스트 2
입력값 〉	[[1], [2]], [[3], [4]]
기댓값 〉	[[4], [6]]
실행 결과 〉	실행한 결괏값 [[4,6]]() 기댓값 [[4],[6]]() 다릅니다.

리스트 안에 리스트를 넣어야 하므로 이중 리스트를 만들어주려고 했다. 하지만 실패했다. 모든 요소가 한 번에 리스트에 들어간 형태가 아니라, 각 각의 값을 더한 행렬 자체가 리턴이 되어야 하는데, 이 부분에서 막혀서 시간을 소비했다.

코드를 보면 당연한 결과지만.. 어려웠다.

  1. 문제 해결
result = []

for mid_arr1, mid_arr2 in zip(arr1, arr2):
    middle = []
    for i, j in zip(mid_arr1, mid_arr2):
        middle.append(i+j)
    # print(middle)
    result.append(middle)
print(result)

# 출력
테스트 1
입력값 〉	[[1, 2], [2, 3]], [[3, 4], [5, 6]]
기댓값 〉	[[4, 6], [7, 9]]
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	[[1], [2]], [[3], [4]]
기댓값 〉	[[4], [6]]
실행 결과 〉	테스트를 통과하였습니다.

이렇게 수정하여 통과하였다.

빈 리스트를 먼저 만들어주고, 중간 리스트를 담을 변수를 첫 번째 반복문 안에 만들어주고 그 그릇에 데이터를 담아 반환하는 방식.

참고

https://www.programiz.com/python-programming/methods/built-in/zip

https://dsbook.tistory.com/175

profile
지뢰찾기 개발자

0개의 댓글