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()
은 두 그룹의 데이터를 서로 엮어주는 파이썬 내장 함수이다.
이렇게 보면 뭐지 싶은데 예시를 통해 보면 굉장히 간단하다.
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
함수 사용을 고려해야 하는 것을 잊지 말아야겠다.