[파이썬 / Algorithm] 프로그래머스 연습문제 level1 - 행렬의 덧셈

waterlyn·2021년 11월 30일
0
post-thumbnail
post-custom-banner

문제

https://programmers.co.kr/learn/courses/30/lessons/12950

풀이

문제를 읽어볼 때에는 위치가 같은 원소끼리 덧셈만 해주면 되니까 굉장히 간단할 것이라고 생각했다. 근데 생각보다 코드가 마음에 들지 않았다.

def solution(arr1, arr2):
    answer = [[0 for _ in range(len(arr1[0]))] for _ in range(len(arr1))]
    for i in range(len(arr1)):
        for j in range(len(arr1[i])):
            answer[i][j] = arr1[i][j] + arr2[i][j]
    return answer

너무 정직하게 작성한 코드인 것 같고 이것을 어떻게 줄일 수 있을지 도저히 감도 안잡혔다.

zip 함수?? 🤔

가장 좋아요를 많이 받은 코드에서 활용한 함수이다. 분명히 예전에 코테 공부하면서 한번 본 적 있는 함수인데 기억이 안나서 다시 공부했다!

zip()은 두 그룹의 데이터를 서로 엮어주는 파이썬 내장 함수이다.

  • 순회 가능한 객체를 인자로 받는다.
  • 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자를 반환한다.

이렇게 보면 뭐지 싶은데 예시를 통해 보면 굉장히 간단하다.

numbers = [1, 2, 3]
alphabets = ['a', 'b', 'c']

for tp in zip(numbers, alphabets):
	print(tp)
    
# 출력 결과 #
(1, 'a')
(2, 'b')
(3, 'c')

두 개의 순회 가능한 객체인 리스트가 선언되어 있다. zip 함수를 사용하여 반복문을 실행하니 두 리스트의 원소 값이 차례대로 하나의 쌍이 되어 나타났다.

따라서 zip()은 두 개의 순회 가능한 객체의 각 원소를 합쳐 튜플의 형태로 반환해주는 함수인 것이다.

이것을 활용하여 다시 문제를 풀어보았다!! 😤

개선된 코드

우선 입력으로 주어지는 코드는 2차원 배열이다. 예시로 보았던 코드는 모두 1차원 배열이었어서 우선 2차원 배열에 이 함수를 사용하면 어떻게 되는지 출력해보았다.

def solution(arr1, arr2):
	for a in zip(arr1, arr2):
    		print(a)
            
 # 출력 결과 #
([1, 2], [3, 4])
([2, 3], [5, 6])

출력 결과를 보니 1차원 리스트를 원소로 하여 튜플이 반환되었다. 이제 각 원소에 접근해야 하기 때문에 zip 함수를 활용할 수 있도록 하기 위해 for 문을 사용하여 두 개의 리스트를 각각 받아와야 한다.

for a, b in zip(arr1, arr2):
	print(a, b)
   
# 출력 결과 #
[1, 2] [3, 4]
[2, 3] [5, 6]

이렇게 하니 각각 리스트를 뽑아올 수 있게 되었다 ! 여기서 중요한 것은 리스트의 인덱스로 전혀 접근을 안했다는 것이다.

이제 이것을 완전하게 코드로 작성하면 다음과 같다.

def solution(arr1, arr2):
    answer = [[c + d for c,d in zip(a,b)] for a, b in zip(arr1, arr2)]
    return answer

앞서 내가 작성한 코드에 비하면 훨씬 깔끔하고 간단하게 작성한 것을 알 수 있었다,,,🥺

순회 가능한 객체를 활용하면서 동일한 위치의 값을 활용해야 할 때에는 zip함수 사용을 고려해야 하는 것을 잊지 말아야겠다.

profile
Hello there 🖤
post-custom-banner

0개의 댓글