[코딩테스트] 프로그래머스 : 행렬계산

김은지·2022년 6월 3일
0

코딩테스트

목록 보기
7/17

2차원 배열 선언하기

2차원 행렬 두 개의 값을 같은 자리의 것 끼리 각각 더해서 하나의 2차원 행렬로 리턴하는 문제에 관해 기록하려고 한다.

  1. 2차원 배열 선언
arr = [[0 for col in range(열의 갯수)] for row in range(행의 갯수)]
#또는
arr = [[0]*열의 갯수 for row in range(행의 갯수)]

이런 방식으로 선언한다.

제대로 선언하지 않고 할당하면 index out of range를 반환한다.

사실 문제를 풀 때는 행렬을 새로 선언하지 않고
주어진 행렬 중 하나를 먼저 answer에 할당하고 나머지 행렬들과 계산을 진행하면 된다.


아래는 내 문제 풀이와, 프로그래머스에 공개되어있는 다른 분의 문제풀이를 가져왔다.


#내풀이
def solution(arr1, arr2):
    answer = [[0]*len(arr1[1]) for row in range(len(arr1))]
    
    for i in range(0, len(arr1)):
      for j in range(0,len(arr1[i])):
        answer[i][j] = arr1[i][j] + arr2[i][j]

    return answer

#다른 분의 풀이

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

행렬의 크기가 작은 경우에도 계산 속도에 차이가 있는데,
아마 맨 마지막 테스트의 행렬 크기가 아마도 큰지 거의 두 배 가까운 속도의 차이를 보인다.

우선 제일 먼저 눈에 띄는 zip이 뭔지 찾아봤는데,
파이썬의 zip() 내장 함수로 데이터 엮기
zip()은 여러개의 순회 가능한 객체를 인자로 받아서, 각 객체가 담고있는 원소를 하나로 묶고, tuple 형식으로 반환해 주는 함수라고 한다.

예를 들어

list1 = [1,2,3,4]
list2 = ['a','b','c','d']

for pair in zip(list1, list2)
	print(pair)
...
...
(1,'a')
(2,'b')
.
.
.

처럼 zip()함수는 여러 그룹의 데이터를 반복문을 한 번만 돌면서 처리 할 수 있도록 해준다.

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

# 여기서 A와 B로 아래 값들이 들어온다면
A = [[1,2],[2,3]]
B = [[3,4],[5,6]]

# 식의 a,b의 값에 첫번째 계산 과정을 살펴보면
#[[c + d for c, d in zip(a, b)] for a, b in zip(A,B)]이 처음 돌아갈 때, 
# a = [1,2], b = [3,4]이고,
# c = 1, d = 3 가 된다.  
# 그래서 답의 answer의 1행 1열은, 4가 된다.  

zip()함수는 한 번도 써본적이 없어서 이후에 사용해보고 추가적으로 기록하겠다.

0개의 댓글